System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 987649a3c0da77c001bcd93dc24ca5227459b9d8:


0000: ef bb bf 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20  ************. * 
0040: 41 44 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61  ADO.NET 2.0 Data
0050: 20 50 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51   Provider for SQ
0060: 4c 69 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58  Lite Version 3.X
0070: 0a 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52  . * Written by R
0080: 6f 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72  obert Simpson (r
0090: 6f 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c  obert@blackcastl
00a0: 65 73 6f 66 74 2e 63 6f 6d 29 0a 20 2a 20 0a 20  esoft.com). * . 
00b0: 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74 68  * Released to th
00c0: 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2c  e public domain,
00d0: 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77 6e   use at your own
00e0: 20 72 69 73 6b 21 0a 20 2a 2a 2a 2a 2a 2a 2a 2a   risk!. ********
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2f 0a 0a 6e 61 6d 65 73 70 61 63 65 20 53 51 4c  /..namespace SQL
0130: 69 74 65 2e 44 65 73 69 67 6e 65 72 2e 44 65 73  ite.Designer.Des
0140: 69 67 6e 0a 7b 0a 20 20 75 73 69 6e 67 20 53 79  ign.{.  using Sy
0150: 73 74 65 6d 3b 0a 20 20 75 73 69 6e 67 20 53 79  stem;.  using Sy
0160: 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69 6f 6e 73  stem.Collections
0170: 2e 47 65 6e 65 72 69 63 3b 0a 20 20 75 73 69 6e  .Generic;.  usin
0180: 67 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74  g System.Collect
0190: 69 6f 6e 73 3b 0a 20 20 75 73 69 6e 67 20 53 79  ions;.  using Sy
01a0: 73 74 65 6d 2e 54 65 78 74 3b 0a 20 20 75 73 69  stem.Text;.  usi
01b0: 6e 67 20 53 79 73 74 65 6d 2e 43 6f 6d 70 6f 6e  ng System.Compon
01c0: 65 6e 74 4d 6f 64 65 6c 3b 0a 20 20 75 73 69 6e  entModel;.  usin
01d0: 67 20 53 79 73 74 65 6d 2e 44 61 74 61 3b 0a 20  g System.Data;. 
01e0: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61   using System.Da
01f0: 74 61 2e 43 6f 6d 6d 6f 6e 3b 0a 20 20 75 73 69  ta.Common;.  usi
0200: 6e 67 20 53 79 73 74 65 6d 2e 43 6f 6d 70 6f 6e  ng System.Compon
0210: 65 6e 74 4d 6f 64 65 6c 2e 44 65 73 69 67 6e 3b  entModel.Design;
0220: 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e  .  using System.
0230: 44 72 61 77 69 6e 67 2e 44 65 73 69 67 6e 3b 0a  Drawing.Design;.
0240: 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 57    using System.W
0250: 69 6e 64 6f 77 73 2e 46 6f 72 6d 73 3b 0a 0a 20  indows.Forms;.. 
0260: 20 69 6e 74 65 72 6e 61 6c 20 63 6c 61 73 73 20   internal class 
0270: 49 6e 64 65 78 45 64 69 74 6f 72 20 3a 20 43 6f  IndexEditor : Co
0280: 6c 6c 65 63 74 69 6f 6e 45 64 69 74 6f 72 0a 20  llectionEditor. 
0290: 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 5f 74 61   {.    Table _ta
02a0: 62 6c 65 3b 0a 20 20 20 20 43 6f 6c 6c 65 63 74  ble;.    Collect
02b0: 69 6f 6e 45 64 69 74 6f 72 2e 43 6f 6c 6c 65 63  ionEditor.Collec
02c0: 74 69 6f 6e 46 6f 72 6d 20 5f 66 6f 72 6d 3b 0a  tionForm _form;.
02d0: 20 20 20 20 6f 62 6a 65 63 74 5b 5d 20 5f 69 74      object[] _it
02e0: 65 6d 73 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  ems = null;.    
02f0: 6f 62 6a 65 63 74 5b 5d 20 5f 6f 72 69 67 3b 0a  object[] _orig;.
0300: 20 20 20 20 69 6e 74 20 5f 63 6f 75 6e 74 3b 0a      int _count;.
0310: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 49 6e  .    internal In
0320: 64 65 78 45 64 69 74 6f 72 28 54 61 62 6c 65 20  dexEditor(Table 
0330: 70 61 72 65 6e 74 29 0a 20 20 20 20 20 20 3a 20  parent).      : 
0340: 62 61 73 65 28 74 79 70 65 6f 66 28 4c 69 73 74  base(typeof(List
0350: 3c 49 6e 64 65 78 3e 29 29 0a 20 20 20 20 7b 0a  <Index>)).    {.
0360: 20 20 20 20 20 20 5f 74 61 62 6c 65 20 3d 20 70        _table = p
0370: 61 72 65 6e 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  arent;.    }..  
0380: 20 20 70 72 6f 74 65 63 74 65 64 20 6f 76 65 72    protected over
0390: 72 69 64 65 20 6f 62 6a 65 63 74 5b 5d 20 47 65  ride object[] Ge
03a0: 74 49 74 65 6d 73 28 6f 62 6a 65 63 74 20 65 64  tItems(object ed
03b0: 69 74 56 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20  itValue).    {. 
03c0: 20 20 20 20 20 69 66 20 28 5f 69 74 65 6d 73 20       if (_items 
03d0: 3d 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 7b  == null).      {
03e0: 0a 20 20 20 20 20 20 20 20 4c 69 73 74 3c 49 6e  .        List<In
03f0: 64 65 78 3e 20 76 61 6c 75 65 20 3d 20 65 64 69  dex> value = edi
0400: 74 56 61 6c 75 65 20 61 73 20 4c 69 73 74 3c 49  tValue as List<I
0410: 6e 64 65 78 3e 3b 0a 0a 20 20 20 20 20 20 20 20  ndex>;..        
0420: 69 6e 74 20 65 78 74 72 61 20 3d 20 28 5f 74 61  int extra = (_ta
0430: 62 6c 65 2e 50 72 69 6d 61 72 79 4b 65 79 2e 43  ble.PrimaryKey.C
0440: 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 20 3e 20 30  olumns.Count > 0
0450: 29 20 3f 20 31 20 3a 20 30 3b 0a 0a 20 20 20 20  ) ? 1 : 0;..    
0460: 20 20 20 20 5f 69 74 65 6d 73 20 3d 20 6e 65 77      _items = new
0470: 20 6f 62 6a 65 63 74 5b 76 61 6c 75 65 2e 43 6f   object[value.Co
0480: 75 6e 74 20 2b 20 65 78 74 72 61 5d 3b 0a 20 20  unt + extra];.  
0490: 20 20 20 20 20 20 5f 6f 72 69 67 20 3d 20 6e 65        _orig = ne
04a0: 77 20 6f 62 6a 65 63 74 5b 5f 69 74 65 6d 73 2e  w object[_items.
04b0: 4c 65 6e 67 74 68 5d 3b 0a 20 20 20 20 20 20 20  Length];.       
04c0: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 65 78   for (int n = ex
04d0: 74 72 61 3b 20 6e 20 3c 20 5f 69 74 65 6d 73 2e  tra; n < _items.
04e0: 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0a 20 20 20  Length; n++).   
04f0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
0500: 20 5f 69 74 65 6d 73 5b 6e 5d 20 3d 20 28 28 49   _items[n] = ((I
0510: 43 6c 6f 6e 65 61 62 6c 65 29 76 61 6c 75 65 5b  Cloneable)value[
0520: 6e 20 2d 20 65 78 74 72 61 5d 29 2e 43 6c 6f 6e  n - extra]).Clon
0530: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 5f  e();.          _
0540: 6f 72 69 67 5b 6e 5d 20 3d 20 76 61 6c 75 65 5b  orig[n] = value[
0550: 6e 20 2d 20 65 78 74 72 61 5d 3b 0a 20 20 20 20  n - extra];.    
0560: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
0570: 66 20 28 65 78 74 72 61 20 3e 20 30 29 0a 20 20  f (extra > 0).  
0580: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
0590: 20 20 5f 69 74 65 6d 73 5b 30 5d 20 3d 20 28 28    _items[0] = ((
05a0: 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 74 61 62 6c  ICloneable)_tabl
05b0: 65 2e 50 72 69 6d 61 72 79 4b 65 79 29 2e 43 6c  e.PrimaryKey).Cl
05c0: 6f 6e 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  one();.         
05d0: 20 5f 6f 72 69 67 5b 30 5d 20 3d 20 5f 74 61 62   _orig[0] = _tab
05e0: 6c 65 2e 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20  le.PrimaryKey;. 
05f0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
0600: 20 20 5f 63 6f 75 6e 74 20 3d 20 5f 69 74 65 6d    _count = _item
0610: 73 2e 4c 65 6e 67 74 68 3b 0a 20 20 20 20 20 20  s.Length;.      
0620: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f  }.      return _
0630: 69 74 65 6d 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  items;.    }..  
0640: 20 20 70 72 6f 74 65 63 74 65 64 20 6f 76 65 72    protected over
0650: 72 69 64 65 20 43 6f 6c 6c 65 63 74 69 6f 6e 45  ride CollectionE
0660: 64 69 74 6f 72 2e 43 6f 6c 6c 65 63 74 69 6f 6e  ditor.Collection
0670: 46 6f 72 6d 20 43 72 65 61 74 65 43 6f 6c 6c 65  Form CreateColle
0680: 63 74 69 6f 6e 46 6f 72 6d 28 29 0a 20 20 20 20  ctionForm().    
0690: 7b 0a 20 20 20 20 20 20 5f 66 6f 72 6d 20 3d 20  {.      _form = 
06a0: 62 61 73 65 2e 43 72 65 61 74 65 43 6f 6c 6c 65  base.CreateColle
06b0: 63 74 69 6f 6e 46 6f 72 6d 28 29 3b 0a 20 20 20  ctionForm();.   
06c0: 20 20 20 5f 66 6f 72 6d 2e 54 65 78 74 20 3d 20     _form.Text = 
06d0: 22 49 6e 64 65 78 20 45 64 69 74 6f 72 22 3b 0a  "Index Editor";.
06e0: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 69 6e 67 20  .      /* Doing 
06f0: 74 68 69 73 20 62 65 63 61 75 73 65 20 49 20 63  this because I c
0700: 61 6e 27 74 20 66 69 67 75 72 65 20 6f 75 74 20  an't figure out 
0710: 68 6f 77 20 74 6f 20 67 65 74 20 74 68 65 20 43  how to get the C
0720: 6f 6c 75 6d 6e 73 20 63 6f 6c 6c 65 63 74 69 6f  olumns collectio
0730: 6e 20 65 64 69 74 6f 72 20 74 6f 20 6e 6f 74 69  n editor to noti
0740: 66 79 20 74 68 69 73 20 65 64 69 74 6f 72 20 77  fy this editor w
0750: 68 65 6e 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20  hen a column of 
0760: 61 6e 20 69 6e 64 65 78 20 69 73 20 75 70 64 61  an index is upda
0770: 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 54 68  ted..         Th
0780: 69 73 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f  is forces the co
0790: 6c 6c 65 63 74 69 6f 6e 20 65 64 69 74 6f 72 20  llection editor 
07a0: 66 6f 72 6d 20 74 6f 20 62 65 20 22 64 69 72 74  form to be "dirt
07b0: 79 22 20 77 68 69 63 68 20 63 61 6c 6c 73 20 53  y" which calls S
07c0: 65 74 49 74 65 6d 73 28 29 20 77 68 65 6e 20 79  etItems() when y
07d0: 6f 75 20 68 69 74 20 4f 4b 20 6f 72 20 63 61 6e  ou hit OK or can
07e0: 63 65 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  cel.  Otherwise,
07f0: 20 69 66 20 79 6f 75 0a 20 20 20 20 20 20 20 20   if you.        
0800: 20 63 68 61 6e 67 65 20 61 20 63 6f 6c 75 6d 6e   change a column
0810: 20 61 72 6f 75 6e 64 20 61 6e 64 20 68 69 74 20   around and hit 
0820: 4f 4b 2c 20 74 68 65 6e 20 68 69 74 20 4f 4b 20  OK, then hit OK 
0830: 6f 6e 20 74 68 69 73 20 65 64 69 74 6f 72 2c 20  on this editor, 
0840: 69 74 20 77 6f 6e 27 74 20 62 65 20 64 69 72 74  it won't be dirt
0850: 79 20 61 6e 64 20 77 6f 6e 27 74 20 75 70 64 61  y and won't upda
0860: 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 74 72 79  te. */.      try
0870: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
0880: 20 5f 66 6f 72 6d 2e 47 65 74 54 79 70 65 28 29   _form.GetType()
0890: 2e 49 6e 76 6f 6b 65 4d 65 6d 62 65 72 28 22 64  .InvokeMember("d
08a0: 69 72 74 79 22 2c 20 53 79 73 74 65 6d 2e 52 65  irty", System.Re
08b0: 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67  flection.Binding
08c0: 46 6c 61 67 73 2e 4e 6f 6e 50 75 62 6c 69 63 20  Flags.NonPublic 
08d0: 7c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74  | System.Reflect
08e0: 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73  ion.BindingFlags
08f0: 2e 49 6e 73 74 61 6e 63 65 20 7c 20 53 79 73 74  .Instance | Syst
0900: 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69  em.Reflection.Bi
0910: 6e 64 69 6e 67 46 6c 61 67 73 2e 53 65 74 46 69  ndingFlags.SetFi
0920: 65 6c 64 2c 20 6e 75 6c 6c 2c 20 5f 66 6f 72 6d  eld, null, _form
0930: 2c 20 6e 65 77 20 6f 62 6a 65 63 74 5b 5d 20 7b  , new object[] {
0940: 20 74 72 75 65 20 7d 29 3b 0a 20 20 20 20 20 20   true });.      
0950: 7d 0a 20 20 20 20 20 20 63 61 74 63 68 0a 20 20  }.      catch.  
0960: 20 20 20 20 7b 0a 20 20 20 20 20 20 7d 0a 0a 20      {.      }.. 
0970: 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 43 6f       foreach (Co
0980: 6e 74 72 6f 6c 20 63 20 69 6e 20 5f 66 6f 72 6d  ntrol c in _form
0990: 2e 43 6f 6e 74 72 6f 6c 73 5b 30 5d 2e 43 6f 6e  .Controls[0].Con
09a0: 74 72 6f 6c 73 29 0a 20 20 20 20 20 20 7b 0a 20  trols).      {. 
09b0: 20 20 20 20 20 20 20 50 72 6f 70 65 72 74 79 47         PropertyG
09c0: 72 69 64 20 67 72 69 64 20 3d 20 63 20 61 73 20  rid grid = c as 
09d0: 50 72 6f 70 65 72 74 79 47 72 69 64 3b 0a 20 20  PropertyGrid;.  
09e0: 20 20 20 20 20 20 69 66 20 28 67 72 69 64 20 21        if (grid !
09f0: 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20  = null).        
0a00: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 72 69 64  {.          grid
0a10: 2e 48 65 6c 70 56 69 73 69 62 6c 65 20 3d 20 74  .HelpVisible = t
0a20: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  rue;.          b
0a30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
0a40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 5f 66        }.      _f
0a50: 6f 72 6d 2e 57 69 64 74 68 20 3d 20 28 69 6e 74  orm.Width = (int
0a60: 29 28 5f 66 6f 72 6d 2e 57 69 64 74 68 20 2a 20  )(_form.Width * 
0a70: 31 2e 32 35 29 3b 0a 20 20 20 20 20 20 5f 66 6f  1.25);.      _fo
0a80: 72 6d 2e 48 65 69 67 68 74 20 3d 20 28 69 6e 74  rm.Height = (int
0a90: 29 28 5f 66 6f 72 6d 2e 48 65 69 67 68 74 20 2a  )(_form.Height *
0aa0: 20 31 2e 32 35 29 3b 0a 0a 20 20 20 20 20 20 72   1.25);..      r
0ab0: 65 74 75 72 6e 20 5f 66 6f 72 6d 3b 0a 20 20 20  eturn _form;.   
0ac0: 20 7d 0a 0a 20 20 20 20 70 72 6f 74 65 63 74 65   }..    protecte
0ad0: 64 20 6f 76 65 72 72 69 64 65 20 6f 62 6a 65 63  d override objec
0ae0: 74 20 43 72 65 61 74 65 49 6e 73 74 61 6e 63 65  t CreateInstance
0af0: 28 54 79 70 65 20 69 74 65 6d 54 79 70 65 29 0a  (Type itemType).
0b00: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66 20 28      {.      if (
0b10: 69 74 65 6d 54 79 70 65 20 3d 3d 20 74 79 70 65  itemType == type
0b20: 6f 66 28 49 6e 64 65 78 29 29 0a 20 20 20 20 20  of(Index)).     
0b30: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
0b40: 6e 20 6e 65 77 20 49 6e 64 65 78 28 6e 75 6c 6c  n new Index(null
0b50: 2c 20 5f 74 61 62 6c 65 2c 20 6e 75 6c 6c 29 3b  , _table, null);
0b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
0b70: 68 72 6f 77 20 6e 65 77 20 4e 6f 74 53 75 70 70  hrow new NotSupp
0b80: 6f 72 74 65 64 45 78 63 65 70 74 69 6f 6e 28 29  ortedException()
0b90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ;.    }..    pro
0ba0: 74 65 63 74 65 64 20 6f 76 65 72 72 69 64 65 20  tected override 
0bb0: 62 6f 6f 6c 20 43 61 6e 52 65 6d 6f 76 65 49 6e  bool CanRemoveIn
0bc0: 73 74 61 6e 63 65 28 6f 62 6a 65 63 74 20 76 61  stance(object va
0bd0: 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  lue).    {.     
0be0: 20 72 65 74 75 72 6e 20 21 28 76 61 6c 75 65 20   return !(value 
0bf0: 69 73 20 50 72 69 6d 61 72 79 4b 65 79 29 3b 0a  is PrimaryKey);.
0c00: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 74 65      }..    prote
0c10: 63 74 65 64 20 6f 76 65 72 72 69 64 65 20 6f 62  cted override ob
0c20: 6a 65 63 74 20 53 65 74 49 74 65 6d 73 28 6f 62  ject SetItems(ob
0c30: 6a 65 63 74 20 65 64 69 74 56 61 6c 75 65 2c 20  ject editValue, 
0c40: 6f 62 6a 65 63 74 5b 5d 20 76 61 6c 75 65 29 0a  object[] value).
0c50: 20 20 20 20 7b 0a 20 20 20 20 20 20 62 6f 6f 6c      {.      bool
0c60: 20 64 69 72 74 79 20 3d 20 66 61 6c 73 65 3b 0a   dirty = false;.
0c70: 20 20 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 20        int count 
0c80: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 20 28  = 0;..      if (
0c90: 5f 66 6f 72 6d 2e 44 69 61 6c 6f 67 52 65 73 75  _form.DialogResu
0ca0: 6c 74 20 3d 3d 20 44 69 61 6c 6f 67 52 65 73 75  lt == DialogResu
0cb0: 6c 74 2e 43 61 6e 63 65 6c 29 0a 20 20 20 20 20  lt.Cancel).     
0cc0: 20 20 20 76 61 6c 75 65 20 3d 20 5f 6f 72 69 67     value = _orig
0cd0: 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 65 64 69  ;..      if (edi
0ce0: 74 56 61 6c 75 65 20 21 3d 20 6e 75 6c 6c 29 0a  tValue != null).
0cf0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
0d00: 69 6e 74 20 6c 65 6e 67 74 68 20 3d 20 74 68 69  int length = thi
0d10: 73 2e 47 65 74 49 74 65 6d 73 28 65 64 69 74 56  s.GetItems(editV
0d20: 61 6c 75 65 29 2e 4c 65 6e 67 74 68 3b 0a 20 20  alue).Length;.  
0d30: 20 20 20 20 20 20 69 6e 74 20 6e 75 6d 32 20 3d        int num2 =
0d40: 20 76 61 6c 75 65 2e 4c 65 6e 67 74 68 3b 0a 20   value.Length;. 
0d50: 20 20 20 20 20 20 20 69 66 20 28 21 28 65 64 69         if (!(edi
0d60: 74 56 61 6c 75 65 20 69 73 20 49 4c 69 73 74 29  tValue is IList)
0d70: 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ).        {.    
0d80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 64 69        return edi
0d90: 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
0da0: 7d 0a 20 20 20 20 20 20 20 20 49 4c 69 73 74 20  }.        IList 
0db0: 6c 69 73 74 20 3d 20 28 49 4c 69 73 74 29 65 64  list = (IList)ed
0dc0: 69 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  itValue;.       
0dd0: 20 6c 69 73 74 2e 43 6c 65 61 72 28 29 3b 0a 20   list.Clear();. 
0de0: 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20         for (int 
0df0: 69 20 3d 20 30 3b 20 69 20 3c 20 76 61 6c 75 65  i = 0; i < value
0e00: 2e 4c 65 6e 67 74 68 3b 20 69 2b 2b 29 0a 20 20  .Length; i++).  
0e10: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
0e20: 20 20 49 6e 64 65 78 20 69 64 78 20 3d 20 76 61    Index idx = va
0e30: 6c 75 65 5b 69 5d 20 61 73 20 49 6e 64 65 78 3b  lue[i] as Index;
0e40: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
0e50: 69 64 78 20 69 73 20 50 72 69 6d 61 72 79 4b 65  idx is PrimaryKe
0e60: 79 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20  y).          {. 
0e70: 20 20 20 20 20 20 20 20 20 20 20 5f 74 61 62 6c             _tabl
0e80: 65 2e 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 28  e.PrimaryKey = (
0e90: 50 72 69 6d 61 72 79 4b 65 79 29 69 64 78 3b 0a  PrimaryKey)idx;.
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
0eb0: 69 64 78 2e 49 73 44 69 72 74 79 29 20 64 69 72  idx.IsDirty) dir
0ec0: 74 79 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  ty = true;.     
0ed0: 20 20 20 20 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a         count++;.
0ee0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0ef0: 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20        else.     
0f00: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
0f10: 20 20 20 69 66 20 28 69 64 78 20 21 3d 20 6e 75     if (idx != nu
0f20: 6c 6c 20 26 26 20 69 64 78 2e 43 6f 6c 75 6d 6e  ll && idx.Column
0f30: 73 2e 43 6f 75 6e 74 20 3e 20 30 29 0a 20 20 20  s.Count > 0).   
0f40: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
0f50: 20 20 20 20 20 20 20 20 20 69 64 78 2e 4e 61 6d           idx.Nam
0f60: 65 20 3d 20 69 64 78 2e 4e 61 6d 65 3b 0a 20 20  e = idx.Name;.  
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 73 74              list
0f80: 2e 41 64 64 28 69 64 78 29 3b 0a 20 20 20 20 20  .Add(idx);.     
0f90: 20 20 20 20 20 20 20 20 20 69 66 20 28 69 64 78           if (idx
0fa0: 2e 49 73 44 69 72 74 79 29 20 64 69 72 74 79 20  .IsDirty) dirty 
0fb0: 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  = true;.        
0fc0: 20 20 20 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a 20        count++;. 
0fd0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0fe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0ff0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
1000: 20 20 69 66 20 28 28 64 69 72 74 79 20 3d 3d 20    if ((dirty == 
1010: 74 72 75 65 20 7c 7c 20 63 6f 75 6e 74 20 21 3d  true || count !=
1020: 20 5f 63 6f 75 6e 74 29 20 26 26 20 5f 66 6f 72   _count) && _for
1030: 6d 2e 44 69 61 6c 6f 67 52 65 73 75 6c 74 20 3d  m.DialogResult =
1040: 3d 20 44 69 61 6c 6f 67 52 65 73 75 6c 74 2e 4f  = DialogResult.O
1050: 4b 29 0a 20 20 20 20 20 20 20 20 5f 74 61 62 6c  K).        _tabl
1060: 65 2e 5f 6f 77 6e 65 72 2e 4d 61 6b 65 44 69 72  e._owner.MakeDir
1070: 74 79 28 29 3b 0a 0a 20 20 20 20 20 20 72 65 74  ty();..      ret
1080: 75 72 6e 20 65 64 69 74 56 61 6c 75 65 3b 0a 20  urn editValue;. 
1090: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 6e 74 65     }.  }..  inte
10a0: 72 6e 61 6c 20 63 6c 61 73 73 20 49 6e 64 65 78  rnal class Index
10b0: 43 6f 6c 75 6d 6e 45 64 69 74 6f 72 20 3a 20 43  ColumnEditor : C
10c0: 6f 6c 6c 65 63 74 69 6f 6e 45 64 69 74 6f 72 0a  ollectionEditor.
10d0: 20 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 5f 69    {.    Index _i
10e0: 6e 64 65 78 3b 0a 20 20 20 20 6f 62 6a 65 63 74  ndex;.    object
10f0: 5b 5d 20 5f 69 74 65 6d 73 3b 0a 20 20 20 20 6f  [] _items;.    o
1100: 62 6a 65 63 74 5b 5d 20 5f 6f 72 69 67 3b 0a 20  bject[] _orig;. 
1110: 20 20 20 69 6e 74 20 5f 63 6f 75 6e 74 3b 0a 20     int _count;. 
1120: 20 20 20 43 6f 6c 6c 65 63 74 69 6f 6e 45 64 69     CollectionEdi
1130: 74 6f 72 2e 43 6f 6c 6c 65 63 74 69 6f 6e 46 6f  tor.CollectionFo
1140: 72 6d 20 5f 66 6f 72 6d 3b 0a 0a 20 20 20 20 70  rm _form;..    p
1150: 75 62 6c 69 63 20 49 6e 64 65 78 43 6f 6c 75 6d  ublic IndexColum
1160: 6e 45 64 69 74 6f 72 28 29 20 3a 20 62 61 73 65  nEditor() : base
1170: 28 74 79 70 65 6f 66 28 4c 69 73 74 3c 49 6e 64  (typeof(List<Ind
1180: 65 78 43 6f 6c 75 6d 6e 3e 29 29 0a 20 20 20 20  exColumn>)).    
1190: 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  {.    }..    pro
11a0: 74 65 63 74 65 64 20 6f 76 65 72 72 69 64 65 20  tected override 
11b0: 43 6f 6c 6c 65 63 74 69 6f 6e 45 64 69 74 6f 72  CollectionEditor
11c0: 2e 43 6f 6c 6c 65 63 74 69 6f 6e 46 6f 72 6d 20  .CollectionForm 
11d0: 43 72 65 61 74 65 43 6f 6c 6c 65 63 74 69 6f 6e  CreateCollection
11e0: 46 6f 72 6d 28 29 0a 20 20 20 20 7b 0a 20 20 20  Form().    {.   
11f0: 20 20 20 5f 66 6f 72 6d 20 3d 20 62 61 73 65 2e     _form = base.
1200: 43 72 65 61 74 65 43 6f 6c 6c 65 63 74 69 6f 6e  CreateCollection
1210: 46 6f 72 6d 28 29 3b 0a 20 20 20 20 20 20 5f 66  Form();.      _f
1220: 6f 72 6d 2e 54 65 78 74 20 3d 20 22 49 6e 64 65  orm.Text = "Inde
1230: 78 20 43 6f 6c 75 6d 6e 73 20 45 64 69 74 6f 72  x Columns Editor
1240: 22 3b 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ";.      foreach
1250: 20 28 43 6f 6e 74 72 6f 6c 20 63 20 69 6e 20 5f   (Control c in _
1260: 66 6f 72 6d 2e 43 6f 6e 74 72 6f 6c 73 5b 30 5d  form.Controls[0]
1270: 2e 43 6f 6e 74 72 6f 6c 73 29 0a 20 20 20 20 20  .Controls).     
1280: 20 7b 0a 20 20 20 20 20 20 20 20 50 72 6f 70 65   {.        Prope
1290: 72 74 79 47 72 69 64 20 67 72 69 64 20 3d 20 63  rtyGrid grid = c
12a0: 20 61 73 20 50 72 6f 70 65 72 74 79 47 72 69 64   as PropertyGrid
12b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 67 72  ;.        if (gr
12c0: 69 64 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20  id != null).    
12d0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
12e0: 67 72 69 64 2e 48 65 6c 70 56 69 73 69 62 6c 65  grid.HelpVisible
12f0: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
1300: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1310: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1320: 20 20 5f 66 6f 72 6d 2e 57 69 64 74 68 20 3d 20    _form.Width = 
1330: 28 69 6e 74 29 28 5f 66 6f 72 6d 2e 57 69 64 74  (int)(_form.Widt
1340: 68 20 2a 20 31 2e 32 35 29 3b 0a 20 20 20 20 20  h * 1.25);.     
1350: 20 5f 66 6f 72 6d 2e 48 65 69 67 68 74 20 3d 20   _form.Height = 
1360: 28 69 6e 74 29 28 5f 66 6f 72 6d 2e 48 65 69 67  (int)(_form.Heig
1370: 68 74 20 2a 20 31 2e 32 35 29 3b 0a 20 20 20 20  ht * 1.25);.    
1380: 20 20 72 65 74 75 72 6e 20 5f 66 6f 72 6d 3b 0a    return _form;.
1390: 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69      }..    publi
13a0: 63 20 6f 76 65 72 72 69 64 65 20 6f 62 6a 65 63  c override objec
13b0: 74 20 45 64 69 74 56 61 6c 75 65 28 49 54 79 70  t EditValue(ITyp
13c0: 65 44 65 73 63 72 69 70 74 6f 72 43 6f 6e 74 65  eDescriptorConte
13d0: 78 74 20 63 6f 6e 74 65 78 74 2c 20 49 53 65 72  xt context, ISer
13e0: 76 69 63 65 50 72 6f 76 69 64 65 72 20 70 72 6f  viceProvider pro
13f0: 76 69 64 65 72 2c 20 6f 62 6a 65 63 74 20 76 61  vider, object va
1400: 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  lue).    {.     
1410: 20 5f 69 6e 64 65 78 20 3d 20 63 6f 6e 74 65 78   _index = contex
1420: 74 2e 49 6e 73 74 61 6e 63 65 20 61 73 20 49 6e  t.Instance as In
1430: 64 65 78 3b 0a 20 20 20 20 20 20 5f 69 74 65 6d  dex;.      _item
1440: 73 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  s = null;.      
1450: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _count = 0;.    
1460: 20 20 72 65 74 75 72 6e 20 62 61 73 65 2e 45 64    return base.Ed
1470: 69 74 56 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  itValue(context,
1480: 20 70 72 6f 76 69 64 65 72 2c 20 76 61 6c 75 65   provider, value
1490: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  );.    }..    pr
14a0: 6f 74 65 63 74 65 64 20 6f 76 65 72 72 69 64 65  otected override
14b0: 20 6f 62 6a 65 63 74 20 43 72 65 61 74 65 49 6e   object CreateIn
14c0: 73 74 61 6e 63 65 28 54 79 70 65 20 69 74 65 6d  stance(Type item
14d0: 54 79 70 65 29 0a 20 20 20 20 7b 0a 20 20 20 20  Type).    {.    
14e0: 20 20 69 66 20 28 69 74 65 6d 54 79 70 65 20 3d    if (itemType =
14f0: 3d 20 74 79 70 65 6f 66 28 49 6e 64 65 78 43 6f  = typeof(IndexCo
1500: 6c 75 6d 6e 29 29 0a 20 20 20 20 20 20 7b 0a 20  lumn)).      {. 
1510: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
1520: 77 20 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 5f 69  w IndexColumn(_i
1530: 6e 64 65 78 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  ndex, null);.   
1540: 20 20 20 7d 0a 20 20 20 20 20 20 74 68 72 6f 77     }.      throw
1550: 20 6e 65 77 20 4e 6f 74 53 75 70 70 6f 72 74 65   new NotSupporte
1560: 64 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20  dException();.  
1570: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 74 65 63 74    }..    protect
1580: 65 64 20 6f 76 65 72 72 69 64 65 20 6f 62 6a 65  ed override obje
1590: 63 74 5b 5d 20 47 65 74 49 74 65 6d 73 28 6f 62  ct[] GetItems(ob
15a0: 6a 65 63 74 20 65 64 69 74 56 61 6c 75 65 29 0a  ject editValue).
15b0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66 20 28      {.      if (
15c0: 5f 69 74 65 6d 73 20 3d 3d 20 6e 75 6c 6c 29 0a  _items == null).
15d0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
15e0: 4c 69 73 74 3c 49 6e 64 65 78 43 6f 6c 75 6d 6e  List<IndexColumn
15f0: 3e 20 76 61 6c 75 65 20 3d 20 65 64 69 74 56 61  > value = editVa
1600: 6c 75 65 20 61 73 20 4c 69 73 74 3c 49 6e 64 65  lue as List<Inde
1610: 78 43 6f 6c 75 6d 6e 3e 3b 0a 20 20 20 20 20 20  xColumn>;.      
1620: 20 20 5f 69 74 65 6d 73 20 3d 20 6e 65 77 20 6f    _items = new o
1630: 62 6a 65 63 74 5b 76 61 6c 75 65 2e 43 6f 75 6e  bject[value.Coun
1640: 74 5d 3b 0a 20 20 20 20 20 20 20 20 5f 6f 72 69  t];.        _ori
1650: 67 20 3d 20 6e 65 77 20 6f 62 6a 65 63 74 5b 76  g = new object[v
1660: 61 6c 75 65 2e 43 6f 75 6e 74 5d 3b 0a 20 20 20  alue.Count];.   
1670: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20       for (int n 
1680: 3d 20 30 3b 20 6e 20 3c 20 5f 69 74 65 6d 73 2e  = 0; n < _items.
1690: 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0a 20 20 20  Length; n++).   
16a0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
16b0: 20 5f 69 74 65 6d 73 5b 6e 5d 20 3d 20 28 28 49   _items[n] = ((I
16c0: 43 6c 6f 6e 65 61 62 6c 65 29 76 61 6c 75 65 5b  Cloneable)value[
16d0: 6e 5d 29 2e 43 6c 6f 6e 65 28 29 3b 0a 20 20 20  n]).Clone();.   
16e0: 20 20 20 20 20 20 20 5f 6f 72 69 67 5b 6e 5d 20         _orig[n] 
16f0: 3d 20 76 61 6c 75 65 5b 6e 5d 3b 0a 20 20 20 20  = value[n];.    
1700: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 5f      }..        _
1710: 63 6f 75 6e 74 20 3d 20 5f 69 74 65 6d 73 2e 4c  count = _items.L
1720: 65 6e 67 74 68 3b 0a 20 20 20 20 20 20 7d 0a 20  ength;.      }. 
1730: 20 20 20 20 20 72 65 74 75 72 6e 20 5f 69 74 65       return _ite
1740: 6d 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ms;.    }..    p
1750: 72 6f 74 65 63 74 65 64 20 6f 76 65 72 72 69 64  rotected overrid
1760: 65 20 6f 62 6a 65 63 74 20 53 65 74 49 74 65 6d  e object SetItem
1770: 73 28 6f 62 6a 65 63 74 20 65 64 69 74 56 61 6c  s(object editVal
1780: 75 65 2c 20 6f 62 6a 65 63 74 5b 5d 20 76 61 6c  ue, object[] val
1790: 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ue).    {.      
17a0: 69 66 20 28 5f 66 6f 72 6d 2e 44 69 61 6c 6f 67  if (_form.Dialog
17b0: 52 65 73 75 6c 74 20 3d 3d 20 44 69 61 6c 6f 67  Result == Dialog
17c0: 52 65 73 75 6c 74 2e 43 61 6e 63 65 6c 29 0a 20  Result.Cancel). 
17d0: 20 20 20 20 20 20 20 76 61 6c 75 65 20 3d 20 5f         value = _
17e0: 6f 72 69 67 3b 0a 0a 20 20 20 20 20 20 69 66 20  orig;..      if 
17f0: 28 65 64 69 74 56 61 6c 75 65 20 21 3d 20 6e 75  (editValue != nu
1800: 6c 6c 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ll).      {.    
1810: 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 20 3d      int length =
1820: 20 74 68 69 73 2e 47 65 74 49 74 65 6d 73 28 65   this.GetItems(e
1830: 64 69 74 56 61 6c 75 65 29 2e 4c 65 6e 67 74 68  ditValue).Length
1840: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 75  ;.        int nu
1850: 6d 32 20 3d 20 76 61 6c 75 65 2e 4c 65 6e 67 74  m2 = value.Lengt
1860: 68 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21  h;.        if (!
1870: 28 65 64 69 74 56 61 6c 75 65 20 69 73 20 49 4c  (editValue is IL
1880: 69 73 74 29 29 0a 20 20 20 20 20 20 20 20 7b 0a  ist)).        {.
1890: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18a0: 20 65 64 69 74 56 61 6c 75 65 3b 0a 20 20 20 20   editValue;.    
18b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4c      }.        IL
18c0: 69 73 74 20 6c 69 73 74 20 3d 20 28 49 4c 69 73  ist list = (ILis
18d0: 74 29 65 64 69 74 56 61 6c 75 65 3b 0a 20 20 20  t)editValue;.   
18e0: 20 20 20 20 20 6c 69 73 74 2e 43 6c 65 61 72 28       list.Clear(
18f0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28  );.        for (
1900: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 76  int i = 0; i < v
1910: 61 6c 75 65 2e 4c 65 6e 67 74 68 3b 20 69 2b 2b  alue.Length; i++
1920: 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ).        {.    
1930: 20 20 20 20 20 20 49 6e 64 65 78 43 6f 6c 75 6d        IndexColum
1940: 6e 20 69 64 78 20 3d 20 76 61 6c 75 65 5b 69 5d  n idx = value[i]
1950: 20 61 73 20 49 6e 64 65 78 43 6f 6c 75 6d 6e 3b   as IndexColumn;
1960: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
1970: 69 64 78 20 21 3d 20 6e 75 6c 6c 20 26 26 20 53  idx != null && S
1980: 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d  tring.IsNullOrEm
1990: 70 74 79 28 69 64 78 2e 43 6f 6c 75 6d 6e 29 20  pty(idx.Column) 
19a0: 3d 3d 20 66 61 6c 73 65 29 0a 20 20 20 20 20 20  == false).      
19b0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
19c0: 20 20 6c 69 73 74 2e 41 64 64 28 76 61 6c 75 65    list.Add(value
19d0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
19e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
19f0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 20 28 28    }..      if ((
1a00: 5f 69 6e 64 65 78 2e 49 73 44 69 72 74 79 20 7c  _index.IsDirty |
1a10: 7c 20 5f 69 6e 64 65 78 2e 43 6f 6c 75 6d 6e 73  | _index.Columns
1a20: 2e 43 6f 75 6e 74 20 21 3d 20 5f 63 6f 75 6e 74  .Count != _count
1a30: 29 20 26 26 20 5f 66 6f 72 6d 2e 44 69 61 6c 6f  ) && _form.Dialo
1a40: 67 52 65 73 75 6c 74 20 3d 3d 20 44 69 61 6c 6f  gResult == Dialo
1a50: 67 52 65 73 75 6c 74 2e 4f 4b 29 0a 20 20 20 20  gResult.OK).    
1a60: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28    {.        if (
1a70: 5f 69 6e 64 65 78 2e 43 6f 6c 75 6d 6e 73 2e 43  _index.Columns.C
1a80: 6f 75 6e 74 20 3e 20 30 20 26 26 20 53 74 72 69  ount > 0 && Stri
1a90: 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
1aa0: 28 5f 69 6e 64 65 78 2e 5f 6e 61 6d 65 29 20 3d  (_index._name) =
1ab0: 3d 20 74 72 75 65 29 0a 20 20 20 20 20 20 20 20  = true).        
1ac0: 20 20 5f 69 6e 64 65 78 2e 4e 61 6d 65 20 3d 20    _index.Name = 
1ad0: 5f 69 6e 64 65 78 2e 4e 61 6d 65 3b 0a 20 20 20  _index.Name;.   
1ae0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1af0: 6e 20 65 64 69 74 56 61 6c 75 65 3b 0a 20 20 20  n editValue;.   
1b00: 20 7d 0a 20 20 7d 0a 0a 20 20 69 6e 74 65 72 6e   }.  }..  intern
1b10: 61 6c 20 63 6c 61 73 73 20 49 6e 64 65 78 54 79  al class IndexTy
1b20: 70 65 43 6f 6e 76 65 72 74 65 72 20 3a 20 54 79  peConverter : Ty
1b30: 70 65 43 6f 6e 76 65 72 74 65 72 0a 20 20 7b 0a  peConverter.  {.
1b40: 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
1b50: 69 64 65 20 62 6f 6f 6c 20 43 61 6e 43 6f 6e 76  ide bool CanConv
1b60: 65 72 74 46 72 6f 6d 28 49 54 79 70 65 44 65 73  ertFrom(ITypeDes
1b70: 63 72 69 70 74 6f 72 43 6f 6e 74 65 78 74 20 63  criptorContext c
1b80: 6f 6e 74 65 78 74 2c 20 54 79 70 65 20 73 6f 75  ontext, Type sou
1b90: 72 63 65 54 79 70 65 29 0a 20 20 20 20 7b 0a 20  rceType).    {. 
1ba0: 20 20 20 20 20 69 66 20 28 73 6f 75 72 63 65 54       if (sourceT
1bb0: 79 70 65 20 3d 3d 20 74 79 70 65 6f 66 28 73 74  ype == typeof(st
1bc0: 72 69 6e 67 29 29 20 72 65 74 75 72 6e 20 74 72  ring)) return tr
1bd0: 75 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ue;.      return
1be0: 20 62 61 73 65 2e 43 61 6e 43 6f 6e 76 65 72 74   base.CanConvert
1bf0: 46 72 6f 6d 28 63 6f 6e 74 65 78 74 2c 20 73 6f  From(context, so
1c00: 75 72 63 65 54 79 70 65 29 3b 0a 20 20 20 20 7d  urceType);.    }
1c10: 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65  ..    public ove
1c20: 72 72 69 64 65 20 62 6f 6f 6c 20 43 61 6e 43 6f  rride bool CanCo
1c30: 6e 76 65 72 74 54 6f 28 49 54 79 70 65 44 65 73  nvertTo(ITypeDes
1c40: 63 72 69 70 74 6f 72 43 6f 6e 74 65 78 74 20 63  criptorContext c
1c50: 6f 6e 74 65 78 74 2c 20 54 79 70 65 20 64 65 73  ontext, Type des
1c60: 74 69 6e 61 74 69 6f 6e 54 79 70 65 29 0a 20 20  tinationType).  
1c70: 20 20 7b 0a 20 20 20 20 20 20 69 66 20 28 64 65    {.      if (de
1c80: 73 74 69 6e 61 74 69 6f 6e 54 79 70 65 20 3d 3d  stinationType ==
1c90: 20 74 79 70 65 6f 66 28 73 74 72 69 6e 67 29 29   typeof(string))
1ca0: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20   return true;.  
1cb0: 20 20 20 20 72 65 74 75 72 6e 20 62 61 73 65 2e      return base.
1cc0: 43 61 6e 43 6f 6e 76 65 72 74 54 6f 28 63 6f 6e  CanConvertTo(con
1cd0: 74 65 78 74 2c 20 64 65 73 74 69 6e 61 74 69 6f  text, destinatio
1ce0: 6e 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  nType);.    }.. 
1cf0: 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69     public overri
1d00: 64 65 20 6f 62 6a 65 63 74 20 43 6f 6e 76 65 72  de object Conver
1d10: 74 54 6f 28 49 54 79 70 65 44 65 73 63 72 69 70  tTo(ITypeDescrip
1d20: 74 6f 72 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65  torContext conte
1d30: 78 74 2c 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61  xt, System.Globa
1d40: 6c 69 7a 61 74 69 6f 6e 2e 43 75 6c 74 75 72 65  lization.Culture
1d50: 49 6e 66 6f 20 63 75 6c 74 75 72 65 2c 20 6f 62  Info culture, ob
1d60: 6a 65 63 74 20 76 61 6c 75 65 2c 20 54 79 70 65  ject value, Type
1d70: 20 64 65 73 74 69 6e 61 74 69 6f 6e 54 79 70 65   destinationType
1d80: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66  ).    {.      if
1d90: 20 28 64 65 73 74 69 6e 61 74 69 6f 6e 54 79 70   (destinationTyp
1da0: 65 20 3d 3d 20 74 79 70 65 6f 66 28 73 74 72 69  e == typeof(stri
1db0: 6e 67 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  ng)).      {.   
1dc0: 20 20 20 20 20 53 74 72 69 6e 67 42 75 69 6c 64       StringBuild
1dd0: 65 72 20 62 75 69 6c 64 65 72 20 3d 20 6e 65 77  er builder = new
1de0: 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29   StringBuilder()
1df0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67  ;.        string
1e00: 20 73 65 70 61 72 61 74 6f 72 20 3d 20 22 22 3b   separator = "";
1e10: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
1e20: 20 28 49 6e 64 65 78 43 6f 6c 75 6d 6e 20 63 20   (IndexColumn c 
1e30: 69 6e 20 28 4c 69 73 74 3c 49 6e 64 65 78 43 6f  in (List<IndexCo
1e40: 6c 75 6d 6e 3e 29 76 61 6c 75 65 29 0a 20 20 20  lumn>)value).   
1e50: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
1e60: 20 62 75 69 6c 64 65 72 2e 41 70 70 65 6e 64 46   builder.AppendF
1e70: 6f 72 6d 61 74 28 22 7b 30 7d 5b 7b 31 7d 5d 22  ormat("{0}[{1}]"
1e80: 2c 20 73 65 70 61 72 61 74 6f 72 2c 20 63 2e 43  , separator, c.C
1e90: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
1ea0: 20 20 69 66 20 28 63 2e 53 6f 72 74 4d 6f 64 65    if (c.SortMode
1eb0: 20 21 3d 20 43 6f 6c 75 6d 6e 53 6f 72 74 4d 6f   != ColumnSortMo
1ec0: 64 65 2e 41 73 63 65 6e 64 69 6e 67 29 0a 20 20  de.Ascending).  
1ed0: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 65            builde
1ee0: 72 2e 41 70 70 65 6e 64 28 22 20 44 45 53 43 22  r.Append(" DESC"
1ef0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  );.          if 
1f00: 28 63 2e 43 6f 6c 6c 61 74 65 20 21 3d 20 22 42  (c.Collate != "B
1f10: 49 4e 41 52 59 22 29 0a 20 20 20 20 20 20 20 20  INARY").        
1f20: 20 20 20 20 62 75 69 6c 64 65 72 2e 41 70 70 65      builder.Appe
1f30: 6e 64 46 6f 72 6d 61 74 28 22 20 43 4f 4c 4c 41  ndFormat(" COLLA
1f40: 54 45 20 7b 30 7d 22 2c 20 63 2e 43 6f 6c 6c 61  TE {0}", c.Colla
1f50: 74 65 2e 54 6f 55 70 70 65 72 49 6e 76 61 72 69  te.ToUpperInvari
1f60: 61 6e 74 28 29 29 3b 0a 0a 20 20 20 20 20 20 20  ant());..       
1f70: 20 20 20 73 65 70 61 72 61 74 6f 72 20 3d 20 22     separator = "
1f80: 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  , ";.        }. 
1f90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 62 75         return bu
1fa0: 69 6c 64 65 72 2e 54 6f 53 74 72 69 6e 67 28 29  ilder.ToString()
1fb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fc0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 65 74  else.        ret
1fd0: 75 72 6e 20 62 61 73 65 2e 43 6f 6e 76 65 72 74  urn base.Convert
1fe0: 54 6f 28 63 6f 6e 74 65 78 74 2c 20 63 75 6c 74  To(context, cult
1ff0: 75 72 65 2c 20 76 61 6c 75 65 2c 20 64 65 73 74  ure, value, dest
2000: 69 6e 61 74 69 6f 6e 54 79 70 65 29 3b 0a 20 20  inationType);.  
2010: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 6e 74 65 72    }.  }..  inter
2020: 6e 61 6c 20 65 6e 75 6d 20 43 6f 6c 75 6d 6e 53  nal enum ColumnS
2030: 6f 72 74 4d 6f 64 65 0a 20 20 7b 0a 20 20 20 20  ortMode.  {.    
2040: 41 73 63 65 6e 64 69 6e 67 20 3d 20 30 2c 0a 20  Ascending = 0,. 
2050: 20 20 20 44 65 73 63 65 6e 64 69 6e 67 20 3d 20     Descending = 
2060: 31 0a 20 20 7d 0a 0a 20 20 5b 44 65 66 61 75 6c  1.  }..  [Defaul
2070: 74 50 72 6f 70 65 72 74 79 28 22 43 6f 6c 75 6d  tProperty("Colum
2080: 6e 22 29 5d 0a 20 20 69 6e 74 65 72 6e 61 6c 20  n")].  internal 
2090: 63 6c 61 73 73 20 49 6e 64 65 78 43 6f 6c 75 6d  class IndexColum
20a0: 6e 20 3a 20 49 48 61 76 65 43 6f 6e 6e 65 63 74  n : IHaveConnect
20b0: 69 6f 6e 53 63 6f 70 65 2c 20 49 43 6c 6f 6e 65  ionScope, IClone
20c0: 61 62 6c 65 0a 20 20 7b 0a 20 20 20 20 69 6e 74  able.  {.    int
20d0: 65 72 6e 61 6c 20 49 6e 64 65 78 20 5f 70 61 72  ernal Index _par
20e0: 65 6e 74 3b 0a 20 20 20 20 70 72 69 76 61 74 65  ent;.    private
20f0: 20 73 74 72 69 6e 67 20 5f 63 6f 6c 75 6d 6e 3b   string _column;
2100: 0a 20 20 20 20 70 72 69 76 61 74 65 20 43 6f 6c  .    private Col
2110: 75 6d 6e 53 6f 72 74 4d 6f 64 65 20 5f 6d 6f 64  umnSortMode _mod
2120: 65 20 3d 20 43 6f 6c 75 6d 6e 53 6f 72 74 4d 6f  e = ColumnSortMo
2130: 64 65 2e 41 73 63 65 6e 64 69 6e 67 3b 0a 20 20  de.Ascending;.  
2140: 20 20 70 72 69 76 61 74 65 20 73 74 72 69 6e 67    private string
2150: 20 5f 63 6f 6c 6c 61 74 65 20 3d 20 22 42 49 4e   _collate = "BIN
2160: 41 52 59 22 3b 0a 0a 20 20 20 20 5b 45 64 69 74  ARY";..    [Edit
2170: 6f 72 28 74 79 70 65 6f 66 28 43 6f 6c 75 6d 6e  or(typeof(Column
2180: 73 54 79 70 65 45 64 69 74 6f 72 29 2c 20 74 79  sTypeEditor), ty
2190: 70 65 6f 66 28 55 49 54 79 70 65 45 64 69 74 6f  peof(UITypeEdito
21a0: 72 29 29 5d 0a 20 20 20 20 5b 44 69 73 70 6c 61  r))].    [Displa
21b0: 79 4e 61 6d 65 28 22 42 61 73 65 20 43 6f 6c 75  yName("Base Colu
21c0: 6d 6e 22 29 5d 0a 20 20 20 20 5b 43 61 74 65 67  mn")].    [Categ
21d0: 6f 72 79 28 22 53 6f 75 72 63 65 22 29 5d 0a 20  ory("Source")]. 
21e0: 20 20 20 5b 44 65 73 63 72 69 70 74 69 6f 6e 28     [Description(
21f0: 22 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  "The column name
2200: 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
2210: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 22 29 5d  in the index.")]
2220: 0a 20 20 20 20 5b 4e 6f 74 69 66 79 50 61 72 65  .    [NotifyPare
2230: 6e 74 50 72 6f 70 65 72 74 79 28 74 72 75 65 29  ntProperty(true)
2240: 5d 0a 20 20 20 20 5b 52 65 66 72 65 73 68 50 72  ].    [RefreshPr
2250: 6f 70 65 72 74 69 65 73 28 52 65 66 72 65 73 68  operties(Refresh
2260: 50 72 6f 70 65 72 74 69 65 73 2e 41 6c 6c 29 5d  Properties.All)]
2270: 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69  .    public stri
2280: 6e 67 20 43 6f 6c 75 6d 6e 0a 20 20 20 20 7b 0a  ng Column.    {.
2290: 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
22a0: 72 6e 20 5f 63 6f 6c 75 6d 6e 3b 20 7d 0a 20 20  rn _column; }.  
22b0: 20 20 20 20 73 65 74 0a 20 20 20 20 20 20 7b 0a      set.      {.
22c0: 20 20 20 20 20 20 20 20 69 66 20 28 5f 63 6f 6c          if (_col
22d0: 75 6d 6e 20 21 3d 20 76 61 6c 75 65 29 0a 20 20  umn != value).  
22e0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
22f0: 20 20 5f 63 6f 6c 75 6d 6e 20 3d 20 76 61 6c 75    _column = valu
2300: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 5f 70 61  e;.          _pa
2310: 72 65 6e 74 2e 4d 61 6b 65 44 69 72 74 79 28 29  rent.MakeDirty()
2320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2330: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5b    }.    }..    [
2340: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 43 6f 6c  DefaultValue(Col
2350: 75 6d 6e 53 6f 72 74 4d 6f 64 65 2e 41 73 63 65  umnSortMode.Asce
2360: 6e 64 69 6e 67 29 5d 0a 20 20 20 20 5b 43 61 74  nding)].    [Cat
2370: 65 67 6f 72 79 28 22 43 6f 6e 73 74 72 61 69 6e  egory("Constrain
2380: 74 73 22 29 5d 0a 20 20 20 20 5b 44 65 73 63 72  ts")].    [Descr
2390: 69 70 74 69 6f 6e 28 22 53 70 65 63 69 66 69 65  iption("Specifie
23a0: 73 20 77 68 61 74 20 6f 72 64 65 72 20 74 6f 20  s what order to 
23b0: 73 6f 72 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sort the column 
23c0: 69 6e 2e 20 20 44 65 73 63 65 6e 64 69 6e 67 20  in.  Descending 
23d0: 69 6e 64 65 78 65 73 20 61 72 65 20 6e 6f 74 20  indexes are not 
23e0: 73 75 70 70 6f 72 74 65 64 20 77 68 65 6e 20 75  supported when u
23f0: 73 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20  sing the SQLite 
2400: 6c 65 67 61 63 79 20 66 69 6c 65 20 66 6f 72 6d  legacy file form
2410: 61 74 2e 22 29 5d 0a 20 20 20 20 5b 4e 6f 74 69  at.")].    [Noti
2420: 66 79 50 61 72 65 6e 74 50 72 6f 70 65 72 74 79  fyParentProperty
2430: 28 74 72 75 65 29 5d 0a 20 20 20 20 5b 52 65 66  (true)].    [Ref
2440: 72 65 73 68 50 72 6f 70 65 72 74 69 65 73 28 52  reshProperties(R
2450: 65 66 72 65 73 68 50 72 6f 70 65 72 74 69 65 73  efreshProperties
2460: 2e 41 6c 6c 29 5d 0a 20 20 20 20 70 75 62 6c 69  .All)].    publi
2470: 63 20 43 6f 6c 75 6d 6e 53 6f 72 74 4d 6f 64 65  c ColumnSortMode
2480: 20 53 6f 72 74 4d 6f 64 65 0a 20 20 20 20 7b 0a   SortMode.    {.
2490: 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
24a0: 72 6e 20 5f 6d 6f 64 65 3b 20 7d 0a 20 20 20 20  rn _mode; }.    
24b0: 20 20 73 65 74 0a 20 20 20 20 20 20 7b 0a 20 20    set.      {.  
24c0: 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
24d0: 21 3d 20 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20  != _mode).      
24e0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 5f 6d    {.          _m
24f0: 6f 64 65 20 3d 20 76 61 6c 75 65 3b 0a 20 20 20  ode = value;.   
2500: 20 20 20 20 20 20 20 5f 70 61 72 65 6e 74 2e 4d         _parent.M
2510: 61 6b 65 44 69 72 74 79 28 29 3b 0a 20 20 20 20  akeDirty();.    
2520: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2530: 20 20 7d 0a 0a 20 20 20 20 5b 44 65 66 61 75 6c    }..    [Defaul
2540: 74 56 61 6c 75 65 28 22 42 49 4e 41 52 59 22 29  tValue("BINARY")
2550: 5d 0a 20 20 20 20 5b 43 61 74 65 67 6f 72 79 28  ].    [Category(
2560: 22 43 6f 6e 73 74 72 61 69 6e 74 73 22 29 5d 0a  "Constraints")].
2570: 20 20 20 20 5b 45 64 69 74 6f 72 28 74 79 70 65      [Editor(type
2580: 6f 66 28 43 6f 6c 6c 61 74 69 6f 6e 54 79 70 65  of(CollationType
2590: 45 64 69 74 6f 72 29 2c 20 74 79 70 65 6f 66 28  Editor), typeof(
25a0: 55 49 54 79 70 65 45 64 69 74 6f 72 29 29 5d 0a  UITypeEditor))].
25b0: 20 20 20 20 5b 44 65 73 63 72 69 70 74 69 6f 6e      [Description
25c0: 28 22 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  ("The collation 
25d0: 73 65 71 75 65 6e 63 65 20 74 6f 20 75 73 65 20  sequence to use 
25e0: 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  to generate the 
25f0: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 73 70  index for the sp
2600: 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 2e 22  ecified column."
2610: 29 5d 0a 20 20 20 20 5b 4e 6f 74 69 66 79 50 61  )].    [NotifyPa
2620: 72 65 6e 74 50 72 6f 70 65 72 74 79 28 74 72 75  rentProperty(tru
2630: 65 29 5d 0a 20 20 20 20 5b 52 65 66 72 65 73 68  e)].    [Refresh
2640: 50 72 6f 70 65 72 74 69 65 73 28 52 65 66 72 65  Properties(Refre
2650: 73 68 50 72 6f 70 65 72 74 69 65 73 2e 41 6c 6c  shProperties.All
2660: 29 5d 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74  )].    public st
2670: 72 69 6e 67 20 43 6f 6c 6c 61 74 65 0a 20 20 20  ring Collate.   
2680: 20 7b 0a 20 20 20 20 20 20 67 65 74 20 7b 20 72   {.      get { r
2690: 65 74 75 72 6e 20 5f 63 6f 6c 6c 61 74 65 3b 20  eturn _collate; 
26a0: 7d 0a 20 20 20 20 20 20 73 65 74 0a 20 20 20 20  }.      set.    
26b0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28    {.        if (
26c0: 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45  String.IsNullOrE
26d0: 6d 70 74 79 28 76 61 6c 75 65 29 29 20 76 61 6c  mpty(value)) val
26e0: 75 65 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a  ue = "BINARY";..
26f0: 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75          if (valu
2700: 65 20 21 3d 20 5f 63 6f 6c 6c 61 74 65 29 0a 20  e != _collate). 
2710: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2720: 20 20 20 5f 63 6f 6c 6c 61 74 65 20 3d 20 76 61     _collate = va
2730: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  lue;.          i
2740: 66 20 28 5f 70 61 72 65 6e 74 20 69 73 20 50 72  f (_parent is Pr
2750: 69 6d 61 72 79 4b 65 79 29 0a 20 20 20 20 20 20  imaryKey).      
2760: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2770: 20 20 50 72 69 6d 61 72 79 4b 65 79 20 70 6b 20    PrimaryKey pk 
2780: 3d 20 5f 70 61 72 65 6e 74 20 61 73 20 50 72 69  = _parent as Pri
2790: 6d 61 72 79 4b 65 79 3b 0a 20 20 20 20 20 20 20  maryKey;.       
27a0: 20 20 20 20 20 69 66 20 28 70 6b 2e 43 6f 6c 75       if (pk.Colu
27b0: 6d 6e 73 2e 43 6f 75 6e 74 20 3d 3d 20 31 29 0a  mns.Count == 1).
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20              {.  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
27e0: 61 63 68 20 28 43 6f 6c 75 6d 6e 20 63 20 69 6e  ach (Column c in
27f0: 20 70 6b 2e 54 61 62 6c 65 2e 43 6f 6c 75 6d 6e   pk.Table.Column
2800: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
2810: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2820: 20 20 20 69 66 20 28 73 74 72 69 6e 67 2e 43 6f     if (string.Co
2830: 6d 70 61 72 65 28 63 2e 43 6f 6c 75 6d 6e 4e 61  mpare(c.ColumnNa
2840: 6d 65 2c 20 43 6f 6c 75 6d 6e 2c 20 53 74 72 69  me, Column, Stri
2850: 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64  ngComparison.Ord
2860: 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20  inalIgnoreCase) 
2870: 3d 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  == 0).          
2880: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2890: 20 20 20 20 20 20 20 20 20 20 63 2e 43 6f 6c 6c            c.Coll
28a0: 61 74 65 20 3d 20 76 61 6c 75 65 3b 0a 20 20 20  ate = value;.   
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
28c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
28d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2900: 7d 0a 20 20 20 20 20 20 20 20 20 20 5f 70 61 72  }.          _par
2910: 65 6e 74 2e 4d 61 6b 65 44 69 72 74 79 28 29 3b  ent.MakeDirty();
2920: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2930: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75   }.    }..    pu
2940: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 73 74  blic override st
2950: 72 69 6e 67 20 54 6f 53 74 72 69 6e 67 28 29 0a  ring ToString().
2960: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66 20 28      {.      if (
2970: 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45  String.IsNullOrE
2980: 6d 70 74 79 28 5f 63 6f 6c 75 6d 6e 29 20 3d 3d  mpty(_column) ==
2990: 20 74 72 75 65 29 20 72 65 74 75 72 6e 20 22 28   true) return "(
29a0: 6e 6f 6e 65 29 22 3b 0a 20 20 20 20 20 20 72 65  none)";.      re
29b0: 74 75 72 6e 20 5f 63 6f 6c 75 6d 6e 3b 0a 20 20  turn _column;.  
29c0: 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65    }..    private
29d0: 20 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 49 6e 64   IndexColumn(Ind
29e0: 65 78 43 6f 6c 75 6d 6e 20 73 6f 75 72 63 65 29  exColumn source)
29f0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 5f 70 61  .    {.      _pa
2a00: 72 65 6e 74 20 3d 20 73 6f 75 72 63 65 2e 5f 70  rent = source._p
2a10: 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 5f 63 6f  arent;.      _co
2a20: 6c 75 6d 6e 20 3d 20 73 6f 75 72 63 65 2e 5f 63  lumn = source._c
2a30: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 5f 6d 6f  olumn;.      _mo
2a40: 64 65 20 3d 20 73 6f 75 72 63 65 2e 5f 6d 6f 64  de = source._mod
2a50: 65 3b 0a 20 20 20 20 20 20 5f 63 6f 6c 6c 61 74  e;.      _collat
2a60: 65 20 3d 20 73 6f 75 72 63 65 2e 5f 63 6f 6c 6c  e = source._coll
2a70: 61 74 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ate;.    }..    
2a80: 69 6e 74 65 72 6e 61 6c 20 49 6e 64 65 78 43 6f  internal IndexCo
2a90: 6c 75 6d 6e 28 49 6e 64 65 78 20 70 61 72 65 6e  lumn(Index paren
2aa0: 74 2c 20 44 61 74 61 52 6f 77 20 72 6f 77 29 0a  t, DataRow row).
2ab0: 20 20 20 20 7b 0a 20 20 20 20 20 20 5f 70 61 72      {.      _par
2ac0: 65 6e 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20  ent = parent;.  
2ad0: 20 20 20 20 69 66 20 28 72 6f 77 20 21 3d 20 6e      if (row != n
2ae0: 75 6c 6c 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  ull).      {.   
2af0: 20 20 20 20 20 5f 63 6f 6c 75 6d 6e 20 3d 20 72       _column = r
2b00: 6f 77 5b 22 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 22  ow["COLUMN_NAME"
2b10: 5d 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0a 20 20  ].ToString();.  
2b20: 20 20 20 20 20 20 69 66 20 28 72 6f 77 2e 49 73        if (row.Is
2b30: 4e 75 6c 6c 28 22 53 4f 52 54 5f 4d 4f 44 45 22  Null("SORT_MODE"
2b40: 29 20 3d 3d 20 66 61 6c 73 65 20 26 26 20 28 73  ) == false && (s
2b50: 74 72 69 6e 67 29 72 6f 77 5b 22 53 4f 52 54 5f  tring)row["SORT_
2b60: 4d 4f 44 45 22 5d 20 21 3d 20 22 41 53 43 22 29  MODE"] != "ASC")
2b70: 0a 20 20 20 20 20 20 20 20 20 20 5f 6d 6f 64 65  .          _mode
2b80: 20 3d 20 43 6f 6c 75 6d 6e 53 6f 72 74 4d 6f 64   = ColumnSortMod
2b90: 65 2e 44 65 73 63 65 6e 64 69 6e 67 3b 0a 0a 20  e.Descending;.. 
2ba0: 20 20 20 20 20 20 20 69 66 20 28 72 6f 77 2e 49         if (row.I
2bb0: 73 4e 75 6c 6c 28 22 43 4f 4c 4c 41 54 49 4f 4e  sNull("COLLATION
2bc0: 5f 4e 41 4d 45 22 29 20 3d 3d 20 66 61 6c 73 65  _NAME") == false
2bd0: 29 0a 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6c  ).          _col
2be0: 6c 61 74 65 20 3d 20 72 6f 77 5b 22 43 4f 4c 4c  late = row["COLL
2bf0: 41 54 49 4f 4e 5f 4e 41 4d 45 22 5d 2e 54 6f 53  ATION_NAME"].ToS
2c00: 74 72 69 6e 67 28 29 2e 54 6f 55 70 70 65 72 49  tring().ToUpperI
2c10: 6e 76 61 72 69 61 6e 74 28 29 3b 0a 20 20 20 20  nvariant();.    
2c20: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
2c30: 75 62 6c 69 63 20 6f 62 6a 65 63 74 20 43 6c 6f  ublic object Clo
2c40: 6e 65 28 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ne().    {.     
2c50: 20 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 64 65   return new Inde
2c60: 78 43 6f 6c 75 6d 6e 28 74 68 69 73 29 3b 0a 20  xColumn(this);. 
2c70: 20 20 20 7d 0a 0a 20 20 20 20 23 72 65 67 69 6f     }..    #regio
2c80: 6e 20 49 48 61 76 65 43 6f 6e 6e 65 63 74 69 6f  n IHaveConnectio
2c90: 6e 53 63 6f 70 65 20 4d 65 6d 62 65 72 73 0a 0a  nScope Members..
2ca0: 20 20 20 20 5b 42 72 6f 77 73 61 62 6c 65 28 66      [Browsable(f
2cb0: 61 6c 73 65 29 5d 0a 20 20 20 20 70 75 62 6c 69  alse)].    publi
2cc0: 63 20 73 74 72 69 6e 67 20 43 61 74 61 6c 6f 67  c string Catalog
2cd0: 53 63 6f 70 65 0a 20 20 20 20 7b 0a 20 20 20 20  Scope.    {.    
2ce0: 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 5f    get { return _
2cf0: 70 61 72 65 6e 74 2e 54 61 62 6c 65 2e 43 61 74  parent.Table.Cat
2d00: 61 6c 6f 67 3b 20 7d 0a 20 20 20 20 7d 0a 0a 20  alog; }.    }.. 
2d10: 20 20 20 5b 42 72 6f 77 73 61 62 6c 65 28 66 61     [Browsable(fa
2d20: 6c 73 65 29 5d 0a 20 20 20 20 70 75 62 6c 69 63  lse)].    public
2d30: 20 73 74 72 69 6e 67 20 54 61 62 6c 65 53 63 6f   string TableSco
2d40: 70 65 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67  pe.    {.      g
2d50: 65 74 20 7b 20 72 65 74 75 72 6e 20 5f 70 61 72  et { return _par
2d60: 65 6e 74 2e 54 61 62 6c 65 2e 4e 61 6d 65 3b 20  ent.Table.Name; 
2d70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 65 6e  }.    }..    #en
2d80: 64 72 65 67 69 6f 6e 0a 0a 20 20 20 20 23 72 65  dregion..    #re
2d90: 67 69 6f 6e 20 49 48 61 76 65 43 6f 6e 6e 65 63  gion IHaveConnec
2da0: 74 69 6f 6e 20 4d 65 6d 62 65 72 73 0a 0a 20 20  tion Members..  
2db0: 20 20 5b 42 72 6f 77 73 61 62 6c 65 28 66 61 6c    [Browsable(fal
2dc0: 73 65 29 5d 0a 20 20 20 20 70 75 62 6c 69 63 20  se)].    public 
2dd0: 56 69 65 77 54 61 62 6c 65 42 61 73 65 20 44 65  ViewTableBase De
2de0: 73 69 67 6e 54 61 62 6c 65 0a 20 20 20 20 7b 0a  signTable.    {.
2df0: 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
2e00: 72 6e 20 5f 70 61 72 65 6e 74 2e 44 65 73 69 67  rn _parent.Desig
2e10: 6e 54 61 62 6c 65 3b 20 7d 0a 20 20 20 20 7d 0a  nTable; }.    }.
2e20: 0a 20 20 20 20 70 75 62 6c 69 63 20 44 62 43 6f  .    public DbCo
2e30: 6e 6e 65 63 74 69 6f 6e 20 47 65 74 43 6f 6e 6e  nnection GetConn
2e40: 65 63 74 69 6f 6e 28 29 0a 20 20 20 20 7b 0a 20  ection().    {. 
2e50: 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 49 48       return ((IH
2e60: 61 76 65 43 6f 6e 6e 65 63 74 69 6f 6e 29 5f 70  aveConnection)_p
2e70: 61 72 65 6e 74 29 2e 47 65 74 43 6f 6e 6e 65 63  arent).GetConnec
2e80: 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d 0a 0a 20  tion();.    }.. 
2e90: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0a 20 20     #endregion.  
2ea0: 7d 0a 0a 20 20 70 75 62 6c 69 63 20 65 6e 75 6d  }..  public enum
2eb0: 20 49 6e 64 65 78 54 79 70 65 45 6e 75 6d 0a 20   IndexTypeEnum. 
2ec0: 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 3d 20 30   {.    Index = 0
2ed0: 2c 0a 20 20 20 20 50 72 69 6d 61 72 79 4b 65 79  ,.    PrimaryKey
2ee0: 20 3d 20 31 2c 0a 20 20 7d 0a 0a 20 20 5b 44 65   = 1,.  }..  [De
2ef0: 66 61 75 6c 74 50 72 6f 70 65 72 74 79 28 22 43  faultProperty("C
2f00: 6f 6c 75 6d 6e 73 22 29 5d 0a 20 20 69 6e 74 65  olumns")].  inte
2f10: 72 6e 61 6c 20 63 6c 61 73 73 20 49 6e 64 65 78  rnal class Index
2f20: 20 3a 20 49 48 61 76 65 43 6f 6e 6e 65 63 74 69   : IHaveConnecti
2f30: 6f 6e 2c 20 49 43 6c 6f 6e 65 61 62 6c 65 0a 20  on, ICloneable. 
2f40: 20 7b 0a 20 20 20 20 70 72 69 76 61 74 65 20 54   {.    private T
2f50: 61 62 6c 65 20 5f 74 61 62 6c 65 3b 0a 20 20 20  able _table;.   
2f60: 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69 6e 67   internal string
2f70: 20 5f 6e 61 6d 65 20 3d 20 6e 75 6c 6c 3b 0a 20   _name = null;. 
2f80: 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20     private bool 
2f90: 5f 75 6e 69 71 75 65 3b 0a 20 20 20 20 70 72 69  _unique;.    pri
2fa0: 76 61 74 65 20 4c 69 73 74 3c 49 6e 64 65 78 43  vate List<IndexC
2fb0: 6f 6c 75 6d 6e 3e 20 5f 63 6f 6c 75 6d 6e 73 20  olumn> _columns 
2fc0: 3d 20 6e 65 77 20 4c 69 73 74 3c 49 6e 64 65 78  = new List<Index
2fd0: 43 6f 6c 75 6d 6e 3e 28 29 3b 0a 20 20 20 20 70  Column>();.    p
2fe0: 72 69 76 61 74 65 20 73 74 72 69 6e 67 20 5f 64  rivate string _d
2ff0: 65 66 69 6e 69 74 69 6f 6e 3b 0a 20 20 20 20 70  efinition;.    p
3000: 72 69 76 61 74 65 20 62 6f 6f 6c 20 5f 63 61 6c  rivate bool _cal
3010: 63 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 65 72  cname;.    inter
3020: 6e 61 6c 20 43 6f 6e 66 6c 69 63 74 45 6e 75 6d  nal ConflictEnum
3030: 20 5f 63 6f 6e 66 6c 69 63 74 20 3d 20 43 6f 6e   _conflict = Con
3040: 66 6c 69 63 74 45 6e 75 6d 2e 41 62 6f 72 74 3b  flictEnum.Abort;
3050: 0a 20 20 20 20 62 6f 6f 6c 20 5f 64 69 72 74 79  .    bool _dirty
3060: 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20 20 70   = false;..    p
3070: 72 6f 74 65 63 74 65 64 20 49 6e 64 65 78 28 49  rotected Index(I
3080: 6e 64 65 78 20 73 6f 75 72 63 65 29 0a 20 20 20  ndex source).   
3090: 20 7b 0a 20 20 20 20 20 20 5f 74 61 62 6c 65 20   {.      _table 
30a0: 3d 20 73 6f 75 72 63 65 2e 5f 74 61 62 6c 65 3b  = source._table;
30b0: 0a 20 20 20 20 20 20 5f 6e 61 6d 65 20 3d 20 73  .      _name = s
30c0: 6f 75 72 63 65 2e 5f 6e 61 6d 65 3b 0a 20 20 20  ource._name;.   
30d0: 20 20 20 5f 75 6e 69 71 75 65 20 3d 20 73 6f 75     _unique = sou
30e0: 72 63 65 2e 5f 75 6e 69 71 75 65 3b 0a 20 20 20  rce._unique;.   
30f0: 20 20 20 5f 64 65 66 69 6e 69 74 69 6f 6e 20 3d     _definition =
3100: 20 73 6f 75 72 63 65 2e 5f 64 65 66 69 6e 69 74   source._definit
3110: 69 6f 6e 3b 0a 20 20 20 20 20 20 5f 63 6f 6e 66  ion;.      _conf
3120: 6c 69 63 74 20 3d 20 73 6f 75 72 63 65 2e 5f 63  lict = source._c
3130: 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 20 20 5f  onflict;.      _
3140: 64 69 72 74 79 20 3d 20 73 6f 75 72 63 65 2e 5f  dirty = source._
3150: 64 69 72 74 79 3b 0a 0a 20 20 20 20 20 20 66 6f  dirty;..      fo
3160: 72 65 61 63 68 20 28 49 6e 64 65 78 43 6f 6c 75  reach (IndexColu
3170: 6d 6e 20 63 20 69 6e 20 73 6f 75 72 63 65 2e 5f  mn c in source._
3180: 63 6f 6c 75 6d 6e 73 29 0a 20 20 20 20 20 20 7b  columns).      {
3190: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 43 6f  .        IndexCo
31a0: 6c 75 6d 6e 20 63 6f 70 79 20 3d 20 28 28 49 43  lumn copy = ((IC
31b0: 6c 6f 6e 65 61 62 6c 65 29 63 29 2e 43 6c 6f 6e  loneable)c).Clon
31c0: 65 28 29 20 61 73 20 49 6e 64 65 78 43 6f 6c 75  e() as IndexColu
31d0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 6f 70 79  mn;.        copy
31e0: 2e 5f 70 61 72 65 6e 74 20 3d 20 74 68 69 73 3b  ._parent = this;
31f0: 0a 20 20 20 20 20 20 20 20 5f 63 6f 6c 75 6d 6e  .        _column
3200: 73 2e 41 64 64 28 63 6f 70 79 29 3b 0a 20 20 20  s.Add(copy);.   
3210: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3220: 69 6e 74 65 72 6e 61 6c 20 49 6e 64 65 78 28 44  internal Index(D
3230: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 2c  bConnection cnn,
3240: 20 54 61 62 6c 65 20 74 61 62 6c 65 2c 20 44 61   Table table, Da
3250: 74 61 52 6f 77 20 69 6e 64 65 78 29 0a 20 20 20  taRow index).   
3260: 20 7b 0a 20 20 20 20 20 20 5f 74 61 62 6c 65 20   {.      _table 
3270: 3d 20 74 61 62 6c 65 3b 0a 20 20 20 20 20 20 69  = table;.      i
3280: 66 20 28 69 6e 64 65 78 20 21 3d 20 6e 75 6c 6c  f (index != null
3290: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
32a0: 20 20 5f 6e 61 6d 65 20 3d 20 69 6e 64 65 78 5b    _name = index[
32b0: 22 49 4e 44 45 58 5f 4e 41 4d 45 22 5d 2e 54 6f  "INDEX_NAME"].To
32c0: 53 74 72 69 6e 67 28 29 3b 0a 20 20 20 20 20 20  String();.      
32d0: 20 20 5f 75 6e 69 71 75 65 20 3d 20 28 62 6f 6f    _unique = (boo
32e0: 6c 29 69 6e 64 65 78 5b 22 55 4e 49 51 55 45 22  l)index["UNIQUE"
32f0: 5d 3b 0a 20 20 20 20 20 20 20 20 5f 64 65 66 69  ];.        _defi
3300: 6e 69 74 69 6f 6e 20 3d 20 69 6e 64 65 78 5b 22  nition = index["
3310: 49 4e 44 45 58 5f 44 45 46 49 4e 49 54 49 4f 4e  INDEX_DEFINITION
3320: 22 5d 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0a 0a  "].ToString();..
3330: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
3340: 61 74 61 54 61 62 6c 65 20 74 62 6c 20 3d 20 63  ataTable tbl = c
3350: 6e 6e 2e 47 65 74 53 63 68 65 6d 61 28 22 49 6e  nn.GetSchema("In
3360: 64 65 78 43 6f 6c 75 6d 6e 73 22 2c 20 6e 65 77  dexColumns", new
3370: 20 73 74 72 69 6e 67 5b 5d 20 7b 20 74 61 62 6c   string[] { tabl
3380: 65 2e 43 61 74 61 6c 6f 67 2c 20 6e 75 6c 6c 2c  e.Catalog, null,
3390: 20 74 61 62 6c 65 2e 4e 61 6d 65 2c 20 4e 61 6d   table.Name, Nam
33a0: 65 20 7d 29 29 0a 20 20 20 20 20 20 20 20 7b 0a  e })).        {.
33b0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
33c0: 68 20 28 44 61 74 61 52 6f 77 20 72 6f 77 20 69  h (DataRow row i
33d0: 6e 20 74 62 6c 2e 52 6f 77 73 29 0a 20 20 20 20  n tbl.Rows).    
33e0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
33f0: 20 20 20 20 5f 63 6f 6c 75 6d 6e 73 2e 41 64 64      _columns.Add
3400: 28 6e 65 77 20 49 6e 64 65 78 43 6f 6c 75 6d 6e  (new IndexColumn
3410: 28 74 68 69 73 2c 20 72 6f 77 29 29 3b 0a 20 20  (this, row));.  
3420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3430: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3440: 7d 0a 0a 20 20 20 20 5b 44 69 73 70 6c 61 79 4e  }..    [DisplayN
3450: 61 6d 65 28 22 49 6e 64 65 78 20 54 79 70 65 22  ame("Index Type"
3460: 29 5d 0a 20 20 20 20 5b 43 61 74 65 67 6f 72 79  )].    [Category
3470: 28 22 53 74 6f 72 61 67 65 22 29 5d 0a 20 20 20  ("Storage")].   
3480: 20 5b 44 65 73 63 72 69 70 74 69 6f 6e 28 22 53   [Description("S
3490: 70 65 63 69 66 69 65 73 20 77 68 65 74 68 65 72  pecifies whether
34a0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 64 65   this is an inde
34b0: 78 20 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b  x or a primary k
34c0: 65 79 2e 22 29 5d 0a 20 20 20 20 70 75 62 6c 69  ey.")].    publi
34d0: 63 20 76 69 72 74 75 61 6c 20 49 6e 64 65 78 54  c virtual IndexT
34e0: 79 70 65 45 6e 75 6d 20 49 6e 64 65 78 54 79 70  ypeEnum IndexTyp
34f0: 65 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67 65  e.    {.      ge
3500: 74 20 7b 20 72 65 74 75 72 6e 20 49 6e 64 65 78  t { return Index
3510: 54 79 70 65 45 6e 75 6d 2e 49 6e 64 65 78 3b 20  TypeEnum.Index; 
3520: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 72 65  }.    }..    #re
3530: 67 69 6f 6e 20 49 48 61 76 65 43 6f 6e 6e 65 63  gion IHaveConnec
3540: 74 69 6f 6e 20 4d 65 6d 62 65 72 73 0a 0a 20 20  tion Members..  
3550: 20 20 5b 42 72 6f 77 73 61 62 6c 65 28 66 61 6c    [Browsable(fal
3560: 73 65 29 5d 0a 20 20 20 20 70 75 62 6c 69 63 20  se)].    public 
3570: 56 69 65 77 54 61 62 6c 65 42 61 73 65 20 44 65  ViewTableBase De
3580: 73 69 67 6e 54 61 62 6c 65 0a 20 20 20 20 7b 0a  signTable.    {.
3590: 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
35a0: 72 6e 20 5f 74 61 62 6c 65 3b 20 7d 0a 20 20 20  rn _table; }.   
35b0: 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 44   }..    public D
35c0: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 47 65 74 43  bConnection GetC
35d0: 6f 6e 6e 65 63 74 69 6f 6e 28 29 0a 20 20 20 20  onnection().    
35e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
35f0: 28 49 48 61 76 65 43 6f 6e 6e 65 63 74 69 6f 6e  (IHaveConnection
3600: 29 5f 74 61 62 6c 65 29 2e 47 65 74 43 6f 6e 6e  )_table).GetConn
3610: 65 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d 0a  ection();.    }.
3620: 0a 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0a  .    #endregion.
3630: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 69  .    internal vi
3640: 72 74 75 61 6c 20 76 6f 69 64 20 57 72 69 74 65  rtual void Write
3650: 53 71 6c 28 53 74 72 69 6e 67 42 75 69 6c 64 65  Sql(StringBuilde
3660: 72 20 62 75 69 6c 64 65 72 29 0a 20 20 20 20 7b  r builder).    {
3670: 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 65  .      string se
3680: 70 61 72 61 74 6f 72 20 3d 20 22 22 3b 0a 20 20  parator = "";.  
3690: 20 20 20 20 62 75 69 6c 64 65 72 2e 41 70 70 65      builder.Appe
36a0: 6e 64 46 6f 72 6d 61 74 28 22 43 52 45 41 54 45  ndFormat("CREATE
36b0: 20 7b 30 7d 49 4e 44 45 58 20 5b 7b 31 7d 5d 2e   {0}INDEX [{1}].
36c0: 5b 7b 32 7d 5d 20 4f 4e 20 5b 7b 33 7d 5d 20 28  [{2}] ON [{3}] (
36d0: 22 2c 20 28 5f 75 6e 69 71 75 65 20 3d 3d 20 74  ", (_unique == t
36e0: 72 75 65 29 20 3f 20 22 55 4e 49 51 55 45 20 22  rue) ? "UNIQUE "
36f0: 20 3a 20 22 22 2c 20 5f 74 61 62 6c 65 2e 43 61   : "", _table.Ca
3700: 74 61 6c 6f 67 2c 20 4e 61 6d 65 2c 20 5f 74 61  talog, Name, _ta
3710: 62 6c 65 2e 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ble.Name);.     
3720: 20 66 6f 72 65 61 63 68 20 28 49 6e 64 65 78 43   foreach (IndexC
3730: 6f 6c 75 6d 6e 20 63 20 69 6e 20 43 6f 6c 75 6d  olumn c in Colum
3740: 6e 73 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ns).      {.    
3750: 20 20 20 20 62 75 69 6c 64 65 72 2e 41 70 70 65      builder.Appe
3760: 6e 64 46 6f 72 6d 61 74 28 22 7b 30 7d 5b 7b 31  ndFormat("{0}[{1
3770: 7d 5d 22 2c 20 73 65 70 61 72 61 74 6f 72 2c 20  }]", separator, 
3780: 63 2e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  c.Column);.     
3790: 20 20 20 0a 20 20 20 20 20 20 20 20 69 66 20 28     .        if (
37a0: 63 2e 53 6f 72 74 4d 6f 64 65 20 21 3d 20 43 6f  c.SortMode != Co
37b0: 6c 75 6d 6e 53 6f 72 74 4d 6f 64 65 2e 41 73 63  lumnSortMode.Asc
37c0: 65 6e 64 69 6e 67 29 0a 20 20 20 20 20 20 20 20  ending).        
37d0: 20 20 62 75 69 6c 64 65 72 2e 41 70 70 65 6e 64    builder.Append
37e0: 28 22 20 44 45 53 43 22 29 3b 0a 0a 20 20 20 20  (" DESC");..    
37f0: 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49      if (String.I
3800: 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 63 2e 43  sNullOrEmpty(c.C
3810: 6f 6c 6c 61 74 65 29 20 26 26 20 53 74 72 69 6e  ollate) && Strin
3820: 67 2e 43 6f 6d 70 61 72 65 28 63 2e 43 6f 6c 6c  g.Compare(c.Coll
3830: 61 74 65 2c 22 42 49 4e 41 52 59 22 2c 20 53 74  ate,"BINARY", St
3840: 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f  ringComparison.O
3850: 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65  rdinalIgnoreCase
3860: 29 20 21 3d 20 30 29 0a 20 20 20 20 20 20 20 20  ) != 0).        
3870: 20 20 62 75 69 6c 64 65 72 2e 41 70 70 65 6e 64    builder.Append
3880: 46 6f 72 6d 61 74 28 22 20 43 4f 4c 4c 41 54 45  Format(" COLLATE
3890: 20 7b 30 7d 22 2c 20 63 2e 43 6f 6c 6c 61 74 65   {0}", c.Collate
38a0: 2e 54 6f 55 70 70 65 72 49 6e 76 61 72 69 61 6e  .ToUpperInvarian
38b0: 74 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 73  t());..        s
38c0: 65 70 61 72 61 74 6f 72 20 3d 20 22 2c 20 22 3b  eparator = ", ";
38d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
38e0: 75 69 6c 64 65 72 2e 41 70 70 65 6e 64 46 6f 72  uilder.AppendFor
38f0: 6d 61 74 28 22 29 3b 22 29 3b 0a 20 20 20 20 7d  mat(");");.    }
3900: 0a 0a 20 20 20 20 5b 42 72 6f 77 73 61 62 6c 65  ..    [Browsable
3910: 28 66 61 6c 73 65 29 5d 0a 20 20 20 20 69 6e 74  (false)].    int
3920: 65 72 6e 61 6c 20 54 61 62 6c 65 20 54 61 62 6c  ernal Table Tabl
3930: 65 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67 65  e.    {.      ge
3940: 74 20 7b 20 72 65 74 75 72 6e 20 5f 74 61 62 6c  t { return _tabl
3950: 65 3b 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e; }.    }..    
3960: 5b 42 72 6f 77 73 61 62 6c 65 28 66 61 6c 73 65  [Browsable(false
3970: 29 5d 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74  )].    public st
3980: 72 69 6e 67 20 4f 72 69 67 69 6e 61 6c 53 71 6c  ring OriginalSql
3990: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67 65 74  .    {.      get
39a0: 20 7b 20 72 65 74 75 72 6e 20 5f 64 65 66 69 6e   { return _defin
39b0: 69 74 69 6f 6e 3b 20 7d 0a 20 20 20 20 7d 0a 0a  ition; }.    }..
39c0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
39d0: 64 20 4d 61 6b 65 44 69 72 74 79 28 29 0a 20 20  d MakeDirty().  
39e0: 20 20 7b 0a 20 20 20 20 20 20 5f 64 69 72 74 79    {.      _dirty
39f0: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 0a   = true;.    }..
3a00: 20 20 20 20 5b 42 72 6f 77 73 61 62 6c 65 28 66      [Browsable(f
3a10: 61 6c 73 65 29 5d 0a 20 20 20 20 69 6e 74 65 72  alse)].    inter
3a20: 6e 61 6c 20 62 6f 6f 6c 20 49 73 44 69 72 74 79  nal bool IsDirty
3a30: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67 65 74  .    {.      get
3a40: 20 7b 20 72 65 74 75 72 6e 20 5f 64 69 72 74 79   { return _dirty
3a50: 3b 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ; }.    }..    i
3a60: 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 43 6c 65  nternal void Cle
3a70: 61 72 44 69 72 74 79 28 29 0a 20 20 20 20 7b 0a  arDirty().    {.
3a80: 20 20 20 20 20 20 5f 64 69 72 74 79 20 3d 20 66        _dirty = f
3a90: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  alse;.    }..   
3aa0: 20 5b 44 65 66 61 75 6c 74 56 61 6c 75 65 28 66   [DefaultValue(f
3ab0: 61 6c 73 65 29 5d 0a 20 20 20 20 5b 44 65 73 63  alse)].    [Desc
3ac0: 72 69 70 74 69 6f 6e 28 22 57 68 65 6e 20 73 65  ription("When se
3ad0: 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 20 63  t to true, the c
3ae0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 63 6f  ombination of co
3af0: 6c 75 6d 6e 28 73 29 20 6f 66 20 74 68 65 20 69  lumn(s) of the i
3b00: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 61 20 75  ndex must be a u
3b10: 6e 69 71 75 65 20 76 61 6c 75 65 2e 22 29 5d 0a  nique value.")].
3b20: 20 20 20 20 70 75 62 6c 69 63 20 76 69 72 74 75      public virtu
3b30: 61 6c 20 62 6f 6f 6c 20 55 6e 69 71 75 65 0a 20  al bool Unique. 
3b40: 20 20 20 7b 0a 20 20 20 20 20 20 67 65 74 20 7b     {.      get {
3b50: 20 72 65 74 75 72 6e 20 5f 75 6e 69 71 75 65 3b   return _unique;
3b60: 20 7d 0a 20 20 20 20 20 20 73 65 74 0a 20 20 20   }.      set.   
3b70: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20     {.        if 
3b80: 28 76 61 6c 75 65 20 21 3d 20 5f 75 6e 69 71 75  (value != _uniqu
3b90: 65 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  e).        {.   
3ba0: 20 20 20 20 20 20 20 5f 75 6e 69 71 75 65 20 3d         _unique =
3bb0: 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20   value;.        
3bc0: 20 20 4d 61 6b 65 44 69 72 74 79 28 29 3b 0a 20    MakeDirty();. 
3bd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3be0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5b 42 72 6f  .    }..    [Bro
3bf0: 77 73 61 62 6c 65 28 66 61 6c 73 65 29 5d 0a 20  wsable(false)]. 
3c00: 20 20 20 70 72 6f 74 65 63 74 65 64 20 76 69 72     protected vir
3c10: 74 75 61 6c 20 73 74 72 69 6e 67 20 4e 61 6d 65  tual string Name
3c20: 50 72 65 66 69 78 0a 20 20 20 20 7b 0a 20 20 20  Prefix.    {.   
3c30: 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20     get { return 
3c40: 22 49 58 22 3b 20 7d 0a 20 20 20 20 7d 0a 0a 20  "IX"; }.    }.. 
3c50: 20 20 20 5b 42 72 6f 77 73 61 62 6c 65 28 66 61     [Browsable(fa
3c60: 6c 73 65 29 5d 0a 20 20 20 20 70 72 6f 74 65 63  lse)].    protec
3c70: 74 65 64 20 76 69 72 74 75 61 6c 20 73 74 72 69  ted virtual stri
3c80: 6e 67 20 4e 65 77 4e 61 6d 65 0a 20 20 20 20 7b  ng NewName.    {
3c90: 0a 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74  .      get { ret
3ca0: 75 72 6e 20 22 4e 65 77 49 6e 64 65 78 22 3b 20  urn "NewIndex"; 
3cb0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5b 50 61  }.    }..    [Pa
3cc0: 72 65 6e 74 68 65 73 69 7a 65 50 72 6f 70 65 72  renthesizeProper
3cd0: 74 79 4e 61 6d 65 28 74 72 75 65 29 5d 0a 20 20  tyName(true)].  
3ce0: 20 20 5b 52 65 66 72 65 73 68 50 72 6f 70 65 72    [RefreshProper
3cf0: 74 69 65 73 28 52 65 66 72 65 73 68 50 72 6f 70  ties(RefreshProp
3d00: 65 72 74 69 65 73 2e 41 6c 6c 29 5d 0a 20 20 20  erties.All)].   
3d10: 20 5b 43 61 74 65 67 6f 72 79 28 22 49 64 65 6e   [Category("Iden
3d20: 74 69 74 79 22 29 5d 0a 20 20 20 20 5b 44 65 73  tity")].    [Des
3d30: 63 72 69 70 74 69 6f 6e 28 22 54 68 65 20 6e 61  cription("The na
3d40: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
3d50: 22 29 5d 0a 20 20 20 20 70 75 62 6c 69 63 20 76  ")].    public v
3d60: 69 72 74 75 61 6c 20 73 74 72 69 6e 67 20 4e 61  irtual string Na
3d70: 6d 65 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67  me.    {.      g
3d80: 65 74 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  et.      {.     
3d90: 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73     if (String.Is
3da0: 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 5f 6e 61 6d  NullOrEmpty(_nam
3db0: 65 29 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  e)).        {.  
3dc0: 20 20 20 20 20 20 20 20 69 66 20 28 5f 63 61 6c          if (_cal
3dd0: 63 6e 61 6d 65 20 3d 3d 20 74 72 75 65 29 20 72  cname == true) r
3de0: 65 74 75 72 6e 20 47 65 74 48 61 73 68 43 6f 64  eturn GetHashCod
3df0: 65 28 29 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0a  e().ToString();.
3e00: 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e  .          strin
3e10: 67 20 6e 61 6d 65 20 3d 20 53 74 72 69 6e 67 2e  g name = String.
3e20: 46 6f 72 6d 61 74 28 22 7b 30 7d 5f 7b 31 7d 22  Format("{0}_{1}"
3e30: 2c 20 4e 61 6d 65 50 72 65 66 69 78 2c 20 4e 65  , NamePrefix, Ne
3e40: 77 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  wName);.        
3e50: 20 20 69 66 20 28 43 6f 6c 75 6d 6e 73 2e 43 6f    if (Columns.Co
3e60: 75 6e 74 20 3e 20 30 20 26 26 20 4e 65 77 4e 61  unt > 0 && NewNa
3e70: 6d 65 20 21 3d 20 54 61 62 6c 65 2e 4e 61 6d 65  me != Table.Name
3e80: 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20  ).          {.  
3e90: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20 3d            name =
3ea0: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
3eb0: 7b 30 7d 5f 22 2c 20 4e 61 6d 65 50 72 65 66 69  {0}_", NamePrefi
3ec0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
3ed0: 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20  for (int n = 0; 
3ee0: 6e 20 3c 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e  n < Columns.Coun
3ef0: 74 3b 20 6e 2b 2b 29 0a 20 20 20 20 20 20 20 20  t; n++).        
3f00: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
3f10: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 6e      if (n > 0) n
3f20: 61 6d 65 20 2b 3d 20 22 5f 22 3b 0a 20 20 20 20  ame += "_";.    
3f30: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20 2b            name +
3f40: 3d 20 43 6f 6c 75 6d 6e 73 5b 6e 5d 2e 43 6f 6c  = Columns[n].Col
3f50: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
3f60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
3f70: 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 75           int cou
3f80: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nt = 0;.        
3f90: 20 20 73 74 72 69 6e 67 20 70 72 6f 70 6f 73 65    string propose
3fa0: 64 20 3d 20 6e 61 6d 65 3b 0a 0a 20 20 20 20 20  d = name;..     
3fb0: 20 20 20 20 20 5f 63 61 6c 63 6e 61 6d 65 20 3d       _calcname =
3fc0: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
3fd0: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b   for (int n = 0;
3fe0: 20 6e 20 3c 20 5f 74 61 62 6c 65 2e 49 6e 64 65   n < _table.Inde
3ff0: 78 65 73 2e 43 6f 75 6e 74 3b 20 6e 2b 2b 29 0a  xes.Count; n++).
4000: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
4010: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 69 64          Index id
4020: 78 20 3d 20 5f 74 61 62 6c 65 2e 49 6e 64 65 78  x = _table.Index
4030: 65 73 5b 6e 5d 3b 0a 20 20 20 20 20 20 20 20 20  es[n];.         
4040: 20 20 20 70 72 6f 70 6f 73 65 64 20 3d 20 73 74     proposed = st
4050: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 7b 30 7d  ring.Format("{0}
4060: 7b 31 7d 22 2c 20 6e 61 6d 65 2c 20 28 63 6f 75  {1}", name, (cou
4070: 6e 74 20 3e 20 30 29 20 3f 20 63 6f 75 6e 74 2e  nt > 0) ? count.
4080: 54 6f 53 74 72 69 6e 67 28 29 20 3a 20 22 22 29  ToString() : "")
4090: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
40a0: 20 28 69 64 78 2e 4e 61 6d 65 20 3d 3d 20 70 72   (idx.Name == pr
40b0: 6f 70 6f 73 65 64 29 0a 20 20 20 20 20 20 20 20  oposed).        
40c0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
40d0: 20 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20      count++;.   
40e0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 2d             n = -
40f0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
4100: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4110: 20 20 20 20 20 20 20 5f 63 61 6c 63 6e 61 6d 65         _calcname
4120: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
4130: 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 70 6f      return propo
4140: 73 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  sed;.        }. 
4150: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 6e         return _n
4160: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
4170: 20 20 20 73 65 74 0a 20 20 20 20 20 20 7b 0a 20     set.      {. 
4180: 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65         if (value
4190: 20 21 3d 20 5f 6e 61 6d 65 29 0a 20 20 20 20 20   != _name).     
41a0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 5f     {.          _
41b0: 6e 61 6d 65 20 3d 20 76 61 6c 75 65 3b 0a 20 20  name = value;.  
41c0: 20 20 20 20 20 20 20 20 4d 61 6b 65 44 69 72 74          MakeDirt
41d0: 79 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  y();.        }. 
41e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
41f0: 20 20 5b 54 79 70 65 43 6f 6e 76 65 72 74 65 72    [TypeConverter
4200: 28 74 79 70 65 6f 66 28 49 6e 64 65 78 54 79 70  (typeof(IndexTyp
4210: 65 43 6f 6e 76 65 72 74 65 72 29 29 5d 0a 20 20  eConverter))].  
4220: 20 20 5b 45 64 69 74 6f 72 28 74 79 70 65 6f 66    [Editor(typeof
4230: 28 49 6e 64 65 78 43 6f 6c 75 6d 6e 45 64 69 74  (IndexColumnEdit
4240: 6f 72 29 2c 20 74 79 70 65 6f 66 28 55 49 54 79  or), typeof(UITy
4250: 70 65 45 64 69 74 6f 72 29 29 5d 0a 20 20 20 20  peEditor))].    
4260: 5b 52 65 66 72 65 73 68 50 72 6f 70 65 72 74 69  [RefreshProperti
4270: 65 73 28 52 65 66 72 65 73 68 50 72 6f 70 65 72  es(RefreshProper
4280: 74 69 65 73 2e 41 6c 6c 29 5d 0a 20 20 20 20 5b  ties.All)].    [
4290: 43 61 74 65 67 6f 72 79 28 22 53 6f 75 72 63 65  Category("Source
42a0: 22 29 5d 0a 20 20 20 20 5b 44 65 73 63 72 69 70  ")].    [Descrip
42b0: 74 69 6f 6e 28 22 54 68 65 20 63 6f 6c 75 6d 6e  tion("The column
42c0: 28 73 29 20 74 6f 20 62 65 20 69 6e 64 65 78 65  (s) to be indexe
42d0: 64 2e 22 29 5d 0a 20 20 20 20 5b 4e 6f 74 69 66  d.")].    [Notif
42e0: 79 50 61 72 65 6e 74 50 72 6f 70 65 72 74 79 28  yParentProperty(
42f0: 74 72 75 65 29 5d 0a 20 20 20 20 70 75 62 6c 69  true)].    publi
4300: 63 20 4c 69 73 74 3c 49 6e 64 65 78 43 6f 6c 75  c List<IndexColu
4310: 6d 6e 3e 20 43 6f 6c 75 6d 6e 73 0a 20 20 20 20  mn> Columns.    
4320: 7b 0a 20 20 20 20 20 20 67 65 74 20 7b 20 72 65  {.      get { re
4330: 74 75 72 6e 20 5f 63 6f 6c 75 6d 6e 73 3b 20 7d  turn _columns; }
4340: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 72 65 67  .    }..    #reg
4350: 69 6f 6e 20 49 43 6c 6f 6e 65 61 62 6c 65 20 4d  ion ICloneable M
4360: 65 6d 62 65 72 73 0a 0a 20 20 20 20 6f 62 6a 65  embers..    obje
4370: 63 74 20 49 43 6c 6f 6e 65 61 62 6c 65 2e 43 6c  ct ICloneable.Cl
4380: 6f 6e 65 28 29 0a 20 20 20 20 7b 0a 20 20 20 20  one().    {.    
4390: 20 20 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 64    return new Ind
43a0: 65 78 28 74 68 69 73 29 3b 0a 20 20 20 20 7d 0a  ex(this);.    }.
43b0: 0a 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0a  .    #endregion.
43c0: 20 20 7d 0a 0a 20 20 70 75 62 6c 69 63 20 63 6c    }..  public cl
43d0: 61 73 73 20 43 6f 6c 75 6d 6e 73 4d 75 6c 74 69  ass ColumnsMulti
43e0: 53 65 6c 65 63 74 45 64 69 74 6f 72 20 3a 20 55  SelectEditor : U
43f0: 49 54 79 70 65 45 64 69 74 6f 72 0a 20 20 7b 0a  ITypeEditor.  {.
4400: 20 20 20 20 70 72 69 76 61 74 65 20 53 79 73 74      private Syst
4410: 65 6d 2e 57 69 6e 64 6f 77 73 2e 46 6f 72 6d 73  em.Windows.Forms
4420: 2e 44 65 73 69 67 6e 2e 49 57 69 6e 64 6f 77 73  .Design.IWindows
4430: 46 6f 72 6d 73 45 64 69 74 6f 72 53 65 72 76 69  FormsEditorServi
4440: 63 65 20 5f 65 64 53 76 63 3b 0a 20 20 20 20 70  ce _edSvc;.    p
4450: 72 69 76 61 74 65 20 43 68 65 63 6b 65 64 4c 69  rivate CheckedLi
4460: 73 74 42 6f 78 20 5f 6c 69 73 74 3b 0a 20 20 20  stBox _list;.   
4470: 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 5f 63   private bool _c
4480: 61 6e 63 65 6c 3b 0a 0a 20 20 20 20 70 75 62 6c  ancel;..    publ
4490: 69 63 20 43 6f 6c 75 6d 6e 73 4d 75 6c 74 69 53  ic ColumnsMultiS
44a0: 65 6c 65 63 74 45 64 69 74 6f 72 28 29 0a 20 20  electEditor().  
44b0: 20 20 7b 0a 20 20 20 20 20 20 2f 2f 20 62 75 69    {.      // bui
44c0: 6c 64 20 73 65 6c 65 63 74 6f 72 20 6c 69 73 74  ld selector list
44d0: 0a 20 20 20 20 20 20 5f 6c 69 73 74 20 3d 20 6e  .      _list = n
44e0: 65 77 20 43 68 65 63 6b 65 64 4c 69 73 74 42 6f  ew CheckedListBo
44f0: 78 28 29 3b 0a 20 20 20 20 20 20 5f 6c 69 73 74  x();.      _list
4500: 2e 42 6f 72 64 65 72 53 74 79 6c 65 20 3d 20 42  .BorderStyle = B
4510: 6f 72 64 65 72 53 74 79 6c 65 2e 46 69 78 65 64  orderStyle.Fixed
4520: 53 69 6e 67 6c 65 3b 0a 20 20 20 20 20 20 5f 6c  Single;.      _l
4530: 69 73 74 2e 43 68 65 63 6b 4f 6e 43 6c 69 63 6b  ist.CheckOnClick
4540: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 5f   = true;.      _
4550: 6c 69 73 74 2e 54 68 72 65 65 44 43 68 65 63 6b  list.ThreeDCheck
4560: 42 6f 78 65 73 20 3d 20 66 61 6c 73 65 3b 0a 20  Boxes = false;. 
4570: 20 20 20 20 20 5f 6c 69 73 74 2e 4b 65 79 50 72       _list.KeyPr
4580: 65 73 73 20 2b 3d 20 6e 65 77 20 4b 65 79 50 72  ess += new KeyPr
4590: 65 73 73 45 76 65 6e 74 48 61 6e 64 6c 65 72 28  essEventHandler(
45a0: 5f 6c 69 73 74 5f 4b 65 79 50 72 65 73 73 29 3b  _list_KeyPress);
45b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 76 65 72  .    }..    over
45c0: 72 69 64 65 20 70 75 62 6c 69 63 20 55 49 54 79  ride public UITy
45d0: 70 65 45 64 69 74 6f 72 45 64 69 74 53 74 79 6c  peEditorEditStyl
45e0: 65 20 47 65 74 45 64 69 74 53 74 79 6c 65 28 49  e GetEditStyle(I
45f0: 54 79 70 65 44 65 73 63 72 69 70 74 6f 72 43 6f  TypeDescriptorCo
4600: 6e 74 65 78 74 20 63 74 78 29 0a 20 20 20 20 7b  ntext ctx).    {
4610: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 49  .      return UI
4620: 54 79 70 65 45 64 69 74 6f 72 45 64 69 74 53 74  TypeEditorEditSt
4630: 79 6c 65 2e 44 72 6f 70 44 6f 77 6e 3b 0a 20 20  yle.DropDown;.  
4640: 20 20 7d 0a 0a 20 20 20 20 6f 76 65 72 72 69 64    }..    overrid
4650: 65 20 70 75 62 6c 69 63 20 6f 62 6a 65 63 74 20  e public object 
4660: 45 64 69 74 56 61 6c 75 65 28 49 54 79 70 65 44  EditValue(ITypeD
4670: 65 73 63 72 69 70 74 6f 72 43 6f 6e 74 65 78 74  escriptorContext
4680: 20 63 74 78 2c 20 49 53 65 72 76 69 63 65 50 72   ctx, IServicePr
4690: 6f 76 69 64 65 72 20 70 72 6f 76 69 64 65 72 2c  ovider provider,
46a0: 20 6f 62 6a 65 63 74 20 76 61 6c 75 65 29 0a 20   object value). 
46b0: 20 20 20 7b 0a 20 20 20 20 20 20 49 6e 64 65 78     {.      Index
46c0: 20 69 64 78 20 3d 20 63 74 78 2e 49 6e 73 74 61   idx = ctx.Insta
46d0: 6e 63 65 20 61 73 20 49 6e 64 65 78 3b 0a 20 20  nce as Index;.  
46e0: 20 20 20 20 54 72 69 67 67 65 72 20 74 72 69 67      Trigger trig
46f0: 20 3d 20 63 74 78 2e 49 6e 73 74 61 6e 63 65 20   = ctx.Instance 
4700: 61 73 20 54 72 69 67 67 65 72 3b 0a 20 20 20 20  as Trigger;.    
4710: 20 20 56 69 65 77 54 61 62 6c 65 42 61 73 65 20    ViewTableBase 
4720: 70 61 72 65 6e 74 20 3d 20 6e 75 6c 6c 3b 0a 0a  parent = null;..
4730: 20 20 20 20 20 20 69 66 20 28 69 64 78 20 21 3d        if (idx !=
4740: 20 6e 75 6c 6c 29 20 70 61 72 65 6e 74 20 3d 20   null) parent = 
4750: 69 64 78 2e 54 61 62 6c 65 3b 0a 20 20 20 20 20  idx.Table;.     
4760: 20 65 6c 73 65 20 69 66 20 28 74 72 69 67 20 21   else if (trig !
4770: 3d 20 6e 75 6c 6c 29 20 70 61 72 65 6e 74 20 3d  = null) parent =
4780: 20 74 72 69 67 2e 56 69 65 77 54 61 62 6c 65 42   trig.ViewTableB
4790: 61 73 65 3b 0a 0a 20 20 20 20 20 20 2f 2f 20 69  ase;..      // i
47a0: 6e 69 74 69 61 6c 69 7a 65 20 65 64 69 74 6f 72  nitialize editor
47b0: 20 73 65 72 76 69 63 65 0a 20 20 20 20 20 20 5f   service.      _
47c0: 65 64 53 76 63 20 3d 20 28 53 79 73 74 65 6d 2e  edSvc = (System.
47d0: 57 69 6e 64 6f 77 73 2e 46 6f 72 6d 73 2e 44 65  Windows.Forms.De
47e0: 73 69 67 6e 2e 49 57 69 6e 64 6f 77 73 46 6f 72  sign.IWindowsFor
47f0: 6d 73 45 64 69 74 6f 72 53 65 72 76 69 63 65 29  msEditorService)
4800: 70 72 6f 76 69 64 65 72 2e 47 65 74 53 65 72 76  provider.GetServ
4810: 69 63 65 28 74 79 70 65 6f 66 28 53 79 73 74 65  ice(typeof(Syste
4820: 6d 2e 57 69 6e 64 6f 77 73 2e 46 6f 72 6d 73 2e  m.Windows.Forms.
4830: 44 65 73 69 67 6e 2e 49 57 69 6e 64 6f 77 73 46  Design.IWindowsF
4840: 6f 72 6d 73 45 64 69 74 6f 72 53 65 72 76 69 63  ormsEditorServic
4850: 65 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 5f  e));.      if (_
4860: 65 64 53 76 63 20 3d 3d 20 6e 75 6c 6c 29 0a 20  edSvc == null). 
4870: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 61         return va
4880: 6c 75 65 3b 0a 0a 20 20 20 20 20 20 69 66 20 28  lue;..      if (
4890: 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 20 76  value == null) v
48a0: 61 6c 75 65 20 3d 20 53 74 72 69 6e 67 2e 45 6d  alue = String.Em
48b0: 70 74 79 3b 0a 20 20 20 20 20 20 69 66 20 28 53  pty;.      if (S
48c0: 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d  tring.IsNullOrEm
48d0: 70 74 79 28 76 61 6c 75 65 2e 54 6f 53 74 72 69  pty(value.ToStri
48e0: 6e 67 28 29 29 20 3d 3d 20 74 72 75 65 29 20 76  ng()) == true) v
48f0: 61 6c 75 65 20 3d 20 53 74 72 69 6e 67 2e 45 6d  alue = String.Em
4900: 70 74 79 3b 0a 0a 20 20 20 20 20 20 73 74 72 69  pty;..      stri
4910: 6e 67 5b 5d 20 76 61 6c 75 65 73 20 3d 20 76 61  ng[] values = va
4920: 6c 75 65 2e 54 6f 53 74 72 69 6e 67 28 29 2e 53  lue.ToString().S
4930: 70 6c 69 74 28 27 2c 27 29 3b 0a 20 20 20 20 20  plit(',');.     
4940: 20 0a 20 20 20 20 20 20 2f 2f 20 70 6f 70 75 6c   .      // popul
4950: 61 74 65 20 74 68 65 20 6c 69 73 74 0a 20 20 20  ate the list.   
4960: 20 20 20 5f 6c 69 73 74 2e 49 74 65 6d 73 2e 43     _list.Items.C
4970: 6c 65 61 72 28 29 3b 0a 0a 20 20 20 20 20 20 69  lear();..      i
4980: 66 20 28 70 61 72 65 6e 74 20 69 73 20 54 61 62  f (parent is Tab
4990: 6c 65 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  le).      {.    
49a0: 20 20 20 20 66 6f 72 65 61 63 68 20 28 43 6f 6c      foreach (Col
49b0: 75 6d 6e 20 63 20 69 6e 20 28 28 54 61 62 6c 65  umn c in ((Table
49c0: 29 70 61 72 65 6e 74 29 2e 43 6f 6c 75 6d 6e 73  )parent).Columns
49d0: 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ).        {.    
49e0: 20 20 20 20 20 20 43 68 65 63 6b 53 74 61 74 65        CheckState
49f0: 20 63 68 65 63 6b 20 3d 20 43 68 65 63 6b 53 74   check = CheckSt
4a00: 61 74 65 2e 55 6e 63 68 65 63 6b 65 64 3b 0a 20  ate.Unchecked;. 
4a10: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e           for (in
4a20: 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 76 61 6c  t n = 0; n < val
4a30: 75 65 73 2e 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29  ues.Length; n++)
4a40: 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20  .          {.   
4a50: 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c           if (val
4a60: 75 65 73 5b 6e 5d 2e 54 72 69 6d 28 29 20 3d 3d  ues[n].Trim() ==
4a70: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
4a80: 5b 7b 30 7d 5d 22 2c 20 63 2e 43 6f 6c 75 6d 6e  [{0}]", c.Column
4a90: 4e 61 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20  Name)).         
4aa0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
4ab0: 20 20 20 63 68 65 63 6b 20 3d 20 43 68 65 63 6b     check = Check
4ac0: 53 74 61 74 65 2e 43 68 65 63 6b 65 64 3b 0a 20  State.Checked;. 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
4ae0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
4af0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
4b00: 20 20 20 20 20 20 20 20 5f 6c 69 73 74 2e 49 74          _list.It
4b10: 65 6d 73 2e 41 64 64 28 63 2e 43 6f 6c 75 6d 6e  ems.Add(c.Column
4b20: 4e 61 6d 65 2c 20 63 68 65 63 6b 29 3b 0a 20 20  Name, check);.  
4b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4b40: 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20        else.     
4b50: 20 7b 0a 20 20 20 20 20 20 20 20 74 72 79 0a 20   {.        try. 
4b60: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
4b70: 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d     using (DbComm
4b80: 61 6e 64 20 63 6d 64 20 3d 20 74 72 69 67 2e 47  and cmd = trig.G
4b90: 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 28 29 2e 43  etConnection().C
4ba0: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0a  reateCommand()).
4bb0: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
4bc0: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
4bd0: 61 6e 64 54 65 78 74 20 3d 20 28 28 56 69 65 77  andText = ((View
4be0: 29 70 61 72 65 6e 74 29 2e 53 71 6c 54 65 78 74  )parent).SqlText
4bf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ;.            us
4c00: 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65  ing (DbDataReade
4c10: 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45  r reader = cmd.E
4c20: 78 65 63 75 74 65 52 65 61 64 65 72 28 43 6f 6d  xecuteReader(Com
4c30: 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 53 63 68  mandBehavior.Sch
4c40: 65 6d 61 4f 6e 6c 79 29 29 0a 20 20 20 20 20 20  emaOnly)).      
4c50: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 61 74        using (Dat
4c60: 61 54 61 62 6c 65 20 74 62 6c 20 3d 20 72 65 61  aTable tbl = rea
4c70: 64 65 72 2e 47 65 74 53 63 68 65 6d 61 54 61 62  der.GetSchemaTab
4c80: 6c 65 28 29 29 0a 20 20 20 20 20 20 20 20 20 20  le()).          
4c90: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
4ca0: 20 20 66 6f 72 65 61 63 68 20 28 44 61 74 61 52    foreach (DataR
4cb0: 6f 77 20 72 6f 77 20 69 6e 20 74 62 6c 2e 52 6f  ow row in tbl.Ro
4cc0: 77 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws).            
4cd0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
4ce0: 20 20 20 20 43 68 65 63 6b 53 74 61 74 65 20 63      CheckState c
4cf0: 68 65 63 6b 20 3d 20 43 68 65 63 6b 53 74 61 74  heck = CheckStat
4d00: 65 2e 55 6e 63 68 65 63 6b 65 64 3b 0a 20 20 20  e.Unchecked;.   
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
4d20: 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c   (int n = 0; n <
4d30: 20 76 61 6c 75 65 73 2e 4c 65 6e 67 74 68 3b 20   values.Length; 
4d40: 6e 2b 2b 29 0a 20 20 20 20 20 20 20 20 20 20 20  n++).           
4d50: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
4d60: 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c           if (val
4d70: 75 65 73 5b 6e 5d 2e 54 72 69 6d 28 29 20 3d 3d  ues[n].Trim() ==
4d80: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
4d90: 5b 7b 30 7d 5d 22 2c 20 72 6f 77 5b 53 63 68 65  [{0}]", row[Sche
4da0: 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 43 6f  maTableColumn.Co
4db0: 6c 75 6d 6e 4e 61 6d 65 5d 29 29 0a 20 20 20 20  lumnName])).    
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a                {.
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 20 20 63 68 65 63 6b 20 3d 20 43 68 65 63      check = Chec
4df0: 6b 53 74 61 74 65 2e 43 68 65 63 6b 65 64 3b 0a  kState.Checked;.
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4e50: 20 5f 6c 69 73 74 2e 49 74 65 6d 73 2e 41 64 64   _list.Items.Add
4e60: 28 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65  (row[SchemaTable
4e70: 43 6f 6c 75 6d 6e 2e 43 6f 6c 75 6d 6e 4e 61 6d  Column.ColumnNam
4e80: 65 5d 2e 54 6f 53 74 72 69 6e 67 28 29 2c 20 63  e].ToString(), c
4e90: 68 65 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  heck);.         
4ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4eb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
4ec0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4ed0: 20 20 20 63 61 74 63 68 0a 20 20 20 20 20 20 20     catch.       
4ee0: 20 7b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   {.        }.   
4ef0: 20 20 20 7d 0a 20 20 20 20 20 20 5f 6c 69 73 74     }.      _list
4f00: 2e 48 65 69 67 68 74 20 3d 20 4d 61 74 68 2e 4d  .Height = Math.M
4f10: 69 6e 28 33 30 30 2c 20 28 5f 6c 69 73 74 2e 49  in(300, (_list.I
4f20: 74 65 6d 73 2e 43 6f 75 6e 74 20 2b 20 31 29 20  tems.Count + 1) 
4f30: 2a 20 5f 6c 69 73 74 2e 46 6f 6e 74 2e 48 65 69  * _list.Font.Hei
4f40: 67 68 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2f 20  ght);..      // 
4f50: 73 68 6f 77 20 74 68 65 20 6c 69 73 74 0a 20 20  show the list.  
4f60: 20 20 20 20 5f 63 61 6e 63 65 6c 20 3d 20 66 61      _cancel = fa
4f70: 6c 73 65 3b 0a 20 20 20 20 20 20 5f 65 64 53 76  lse;.      _edSv
4f80: 63 2e 44 72 6f 70 44 6f 77 6e 43 6f 6e 74 72 6f  c.DropDownContro
4f90: 6c 28 5f 6c 69 73 74 29 3b 0a 0a 20 20 20 20 20  l(_list);..     
4fa0: 20 2f 2f 20 62 75 69 6c 64 20 72 65 74 75 72 6e   // build return
4fb0: 20 76 61 6c 75 65 20 66 72 6f 6d 20 63 68 65 63   value from chec
4fc0: 6b 65 64 20 69 74 65 6d 73 20 6f 6e 20 74 68 65  ked items on the
4fd0: 20 6c 69 73 74 0a 20 20 20 20 20 20 69 66 20 28   list.      if (
4fe0: 21 5f 63 61 6e 63 65 6c 29 0a 20 20 20 20 20 20  !_cancel).      
4ff0: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 62 75 69  {.        // bui
5000: 6c 64 20 61 20 63 6f 6d 6d 61 2d 64 65 6c 69 6d  ld a comma-delim
5010: 69 74 65 64 20 73 74 72 69 6e 67 20 77 69 74 68  ited string with
5020: 20 74 68 65 20 63 68 65 63 6b 65 64 20 69 74 65   the checked ite
5030: 6d 73 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e  ms.        Strin
5040: 67 42 75 69 6c 64 65 72 20 73 62 20 3d 20 6e 65  gBuilder sb = ne
5050: 77 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28  w StringBuilder(
5060: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  );.        forea
5070: 63 68 20 28 6f 62 6a 65 63 74 20 69 74 65 6d 20  ch (object item 
5080: 69 6e 20 5f 6c 69 73 74 2e 43 68 65 63 6b 65 64  in _list.Checked
5090: 49 74 65 6d 73 29 0a 20 20 20 20 20 20 20 20 7b  Items).        {
50a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73  .          if (s
50b0: 62 2e 4c 65 6e 67 74 68 20 3e 20 30 29 20 73 62  b.Length > 0) sb
50c0: 2e 41 70 70 65 6e 64 28 22 2c 20 22 29 3b 0a 20  .Append(", ");. 
50d0: 20 20 20 20 20 20 20 20 20 73 62 2e 41 70 70 65           sb.Appe
50e0: 6e 64 46 6f 72 6d 61 74 28 22 5b 7b 30 7d 5d 22  ndFormat("[{0}]"
50f0: 2c 20 69 74 65 6d 2e 54 6f 53 74 72 69 6e 67 28  , item.ToString(
5100: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ));.        }.. 
5110: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 62         return sb
5120: 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0a 20 20 20  .ToString();.   
5130: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2f 20 64     }..      // d
5140: 6f 6e 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e  one.      return
5150: 20 76 61 6c 75 65 3b 0a 20 20 20 20 7d 0a 0a 20   value;.    }.. 
5160: 20 20 20 2f 2f 20 2a 2a 20 65 76 65 6e 74 20 68     // ** event h
5170: 61 6e 64 6c 65 72 73 0a 0a 20 20 20 20 2f 2f 20  andlers..    // 
5180: 63 6c 6f 73 65 20 65 64 69 74 6f 72 20 69 66 20  close editor if 
5190: 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73  the user presses
51a0: 20 65 6e 74 65 72 20 6f 72 20 65 73 63 61 70 65   enter or escape
51b0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69  .    private voi
51c0: 64 20 5f 6c 69 73 74 5f 4b 65 79 50 72 65 73 73  d _list_KeyPress
51d0: 28 6f 62 6a 65 63 74 20 73 65 6e 64 65 72 2c 20  (object sender, 
51e0: 4b 65 79 50 72 65 73 73 45 76 65 6e 74 41 72 67  KeyPressEventArg
51f0: 73 20 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  s e).    {.     
5200: 20 73 77 69 74 63 68 20 28 65 2e 4b 65 79 43 68   switch (e.KeyCh
5210: 61 72 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ar).      {.    
5220: 20 20 20 20 63 61 73 65 20 28 63 68 61 72 29 32      case (char)2
5230: 37 3a 0a 20 20 20 20 20 20 20 20 20 20 5f 63 61  7:.          _ca
5240: 6e 63 65 6c 20 3d 20 74 72 75 65 3b 0a 20 20 20  ncel = true;.   
5250: 20 20 20 20 20 20 20 5f 65 64 53 76 63 2e 43 6c         _edSvc.Cl
5260: 6f 73 65 44 72 6f 70 44 6f 77 6e 28 29 3b 0a 20  oseDropDown();. 
5270: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5280: 20 20 20 20 20 20 20 20 63 61 73 65 20 28 63 68          case (ch
5290: 61 72 29 31 33 3a 0a 20 20 20 20 20 20 20 20 20  ar)13:.         
52a0: 20 5f 65 64 53 76 63 2e 43 6c 6f 73 65 44 72 6f   _edSvc.CloseDro
52b0: 70 44 6f 77 6e 28 29 3b 0a 20 20 20 20 20 20 20  pDown();.       
52c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
52d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
52e0: 6e 74 65 72 6e 61 6c 20 63 6c 61 73 73 20 43 6f  nternal class Co
52f0: 6c 75 6d 6e 73 54 79 70 65 45 64 69 74 6f 72 20  lumnsTypeEditor 
5300: 3a 20 4f 62 6a 65 63 74 53 65 6c 65 63 74 6f 72  : ObjectSelector
5310: 45 64 69 74 6f 72 0a 20 20 7b 0a 20 20 20 20 70  Editor.  {.    p
5320: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 55  ublic override U
5330: 49 54 79 70 65 45 64 69 74 6f 72 45 64 69 74 53  ITypeEditorEditS
5340: 74 79 6c 65 20 47 65 74 45 64 69 74 53 74 79 6c  tyle GetEditStyl
5350: 65 28 49 54 79 70 65 44 65 73 63 72 69 70 74 6f  e(ITypeDescripto
5360: 72 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 74  rContext context
5370: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65  ).    {.      re
5380: 74 75 72 6e 20 55 49 54 79 70 65 45 64 69 74 6f  turn UITypeEdito
5390: 72 45 64 69 74 53 74 79 6c 65 2e 44 72 6f 70 44  rEditStyle.DropD
53a0: 6f 77 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  own;.    }..    
53b0: 70 72 6f 74 65 63 74 65 64 20 6f 76 65 72 72 69  protected overri
53c0: 64 65 20 76 6f 69 64 20 46 69 6c 6c 54 72 65 65  de void FillTree
53d0: 57 69 74 68 44 61 74 61 28 53 65 6c 65 63 74 6f  WithData(Selecto
53e0: 72 20 73 65 6c 65 63 74 6f 72 2c 20 49 54 79 70  r selector, ITyp
53f0: 65 44 65 73 63 72 69 70 74 6f 72 43 6f 6e 74 65  eDescriptorConte
5400: 78 74 20 63 6f 6e 74 65 78 74 2c 20 49 53 65 72  xt context, ISer
5410: 76 69 63 65 50 72 6f 76 69 64 65 72 20 70 72 6f  viceProvider pro
5420: 76 69 64 65 72 29 0a 20 20 20 20 7b 0a 20 20 20  vider).    {.   
5430: 20 20 20 62 61 73 65 2e 46 69 6c 6c 54 72 65 65     base.FillTree
5440: 57 69 74 68 44 61 74 61 28 73 65 6c 65 63 74 6f  WithData(selecto
5450: 72 2c 20 63 6f 6e 74 65 78 74 2c 20 70 72 6f 76  r, context, prov
5460: 69 64 65 72 29 3b 0a 20 20 20 20 20 20 49 48 61  ider);.      IHa
5470: 76 65 43 6f 6e 6e 65 63 74 69 6f 6e 53 63 6f 70  veConnectionScop
5480: 65 20 73 6f 75 72 63 65 20 3d 20 63 6f 6e 74 65  e source = conte
5490: 78 74 2e 49 6e 73 74 61 6e 63 65 20 61 73 20 49  xt.Instance as I
54a0: 48 61 76 65 43 6f 6e 6e 65 63 74 69 6f 6e 53 63  HaveConnectionSc
54b0: 6f 70 65 3b 0a 20 20 20 20 20 20 56 69 65 77 54  ope;.      ViewT
54c0: 61 62 6c 65 42 61 73 65 20 64 65 73 69 67 6e 3b  ableBase design;
54d0: 0a 0a 20 20 20 20 20 20 69 66 20 28 73 6f 75 72  ..      if (sour
54e0: 63 65 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75  ce == null) retu
54f0: 72 6e 3b 0a 0a 20 20 20 20 20 20 64 65 73 69 67  rn;..      desig
5500: 6e 20 3d 20 73 6f 75 72 63 65 2e 44 65 73 69 67  n = source.Desig
5510: 6e 54 61 62 6c 65 3b 0a 0a 20 20 20 20 20 20 69  nTable;..      i
5520: 66 20 28 64 65 73 69 67 6e 2e 4e 61 6d 65 20 21  f (design.Name !
5530: 3d 20 73 6f 75 72 63 65 2e 54 61 62 6c 65 53 63  = source.TableSc
5540: 6f 70 65 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  ope).      {.   
5550: 20 20 20 20 20 75 73 69 6e 67 20 28 44 61 74 61       using (Data
5560: 54 61 62 6c 65 20 74 61 62 6c 65 20 3d 20 73 6f  Table table = so
5570: 75 72 63 65 2e 47 65 74 43 6f 6e 6e 65 63 74 69  urce.GetConnecti
5580: 6f 6e 28 29 2e 47 65 74 53 63 68 65 6d 61 28 22  on().GetSchema("
5590: 43 6f 6c 75 6d 6e 73 22 2c 20 6e 65 77 20 73 74  Columns", new st
55a0: 72 69 6e 67 5b 5d 20 7b 20 73 6f 75 72 63 65 2e  ring[] { source.
55b0: 43 61 74 61 6c 6f 67 53 63 6f 70 65 2c 20 6e 75  CatalogScope, nu
55c0: 6c 6c 2c 20 73 6f 75 72 63 65 2e 54 61 62 6c 65  ll, source.Table
55d0: 53 63 6f 70 65 20 7d 29 29 0a 20 20 20 20 20 20  Scope })).      
55e0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f    {.          fo
55f0: 72 65 61 63 68 20 28 44 61 74 61 52 6f 77 20 72  reach (DataRow r
5600: 6f 77 20 69 6e 20 74 61 62 6c 65 2e 52 6f 77 73  ow in table.Rows
5610: 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20  ).          {.  
5620: 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
5630: 6f 72 2e 41 64 64 4e 6f 64 65 28 72 6f 77 5b 33  or.AddNode(row[3
5640: 5d 2e 54 6f 53 74 72 69 6e 67 28 29 2c 20 72 6f  ].ToString(), ro
5650: 77 5b 33 5d 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  w[3], null);.   
5660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5670: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5680: 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20   else.      {.  
5690: 20 20 20 20 20 20 54 61 62 6c 65 20 74 62 6c 20        Table tbl 
56a0: 3d 20 64 65 73 69 67 6e 20 61 73 20 54 61 62 6c  = design as Tabl
56b0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 74  e;.        if (t
56c0: 62 6c 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20  bl != null).    
56d0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
56e0: 66 6f 72 65 61 63 68 20 28 43 6f 6c 75 6d 6e 20  foreach (Column 
56f0: 63 20 69 6e 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73  c in tbl.Columns
5700: 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20  ).          {.  
5710: 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
5720: 6f 72 2e 41 64 64 4e 6f 64 65 28 63 2e 43 6f 6c  or.AddNode(c.Col
5730: 75 6d 6e 4e 61 6d 65 2c 20 63 2e 43 6f 6c 75 6d  umnName, c.Colum
5740: 6e 4e 61 6d 65 2c 20 6e 75 6c 6c 29 3b 0a 20 20  nName, null);.  
5750: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5760: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5770: 7d 0a 20 20 7d 0a 0a 20 20 69 6e 74 65 72 6e 61  }.  }..  interna
5780: 6c 20 63 6c 61 73 73 20 54 61 62 6c 65 73 54 79  l class TablesTy
5790: 70 65 45 64 69 74 6f 72 20 3a 20 4f 62 6a 65 63  peEditor : Objec
57a0: 74 53 65 6c 65 63 74 6f 72 45 64 69 74 6f 72 0a  tSelectorEditor.
57b0: 20 20 7b 0a 20 20 20 20 70 75 62 6c 69 63 20 6f    {.    public o
57c0: 76 65 72 72 69 64 65 20 55 49 54 79 70 65 45 64  verride UITypeEd
57d0: 69 74 6f 72 45 64 69 74 53 74 79 6c 65 20 47 65  itorEditStyle Ge
57e0: 74 45 64 69 74 53 74 79 6c 65 28 49 54 79 70 65  tEditStyle(IType
57f0: 44 65 73 63 72 69 70 74 6f 72 43 6f 6e 74 65 78  DescriptorContex
5800: 74 20 63 6f 6e 74 65 78 74 29 0a 20 20 20 20 7b  t context).    {
5810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 49  .      return UI
5820: 54 79 70 65 45 64 69 74 6f 72 45 64 69 74 53 74  TypeEditorEditSt
5830: 79 6c 65 2e 44 72 6f 70 44 6f 77 6e 3b 0a 20 20  yle.DropDown;.  
5840: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 74 65 63 74    }..    protect
5850: 65 64 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  ed override void
5860: 20 46 69 6c 6c 54 72 65 65 57 69 74 68 44 61 74   FillTreeWithDat
5870: 61 28 53 65 6c 65 63 74 6f 72 20 73 65 6c 65 63  a(Selector selec
5880: 74 6f 72 2c 20 49 54 79 70 65 44 65 73 63 72 69  tor, ITypeDescri
5890: 70 74 6f 72 43 6f 6e 74 65 78 74 20 63 6f 6e 74  ptorContext cont
58a0: 65 78 74 2c 20 49 53 65 72 76 69 63 65 50 72 6f  ext, IServicePro
58b0: 76 69 64 65 72 20 70 72 6f 76 69 64 65 72 29 0a  vider provider).
58c0: 20 20 20 20 7b 0a 20 20 20 20 20 20 62 61 73 65      {.      base
58d0: 2e 46 69 6c 6c 54 72 65 65 57 69 74 68 44 61 74  .FillTreeWithDat
58e0: 61 28 73 65 6c 65 63 74 6f 72 2c 20 63 6f 6e 74  a(selector, cont
58f0: 65 78 74 2c 20 70 72 6f 76 69 64 65 72 29 3b 0a  ext, provider);.
5900: 20 20 20 20 20 20 49 48 61 76 65 43 6f 6e 6e 65        IHaveConne
5910: 63 74 69 6f 6e 53 63 6f 70 65 20 73 6f 75 72 63  ctionScope sourc
5920: 65 20 3d 20 63 6f 6e 74 65 78 74 2e 49 6e 73 74  e = context.Inst
5930: 61 6e 63 65 20 61 73 20 49 48 61 76 65 43 6f 6e  ance as IHaveCon
5940: 6e 65 63 74 69 6f 6e 53 63 6f 70 65 3b 0a 20 20  nectionScope;.  
5950: 20 20 20 20 54 61 62 6c 65 20 64 65 73 69 67 6e      Table design
5960: 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 73 6f 75  ;..      if (sou
5970: 72 63 65 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74  rce == null) ret
5980: 75 72 6e 3b 0a 0a 20 20 20 20 20 20 64 65 73 69  urn;..      desi
5990: 67 6e 20 3d 20 73 6f 75 72 63 65 2e 44 65 73 69  gn = source.Desi
59a0: 67 6e 54 61 62 6c 65 20 61 73 20 54 61 62 6c 65  gnTable as Table
59b0: 3b 0a 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28  ;..      using (
59c0: 44 61 74 61 54 61 62 6c 65 20 74 61 62 6c 65 20  DataTable table 
59d0: 3d 20 73 6f 75 72 63 65 2e 47 65 74 43 6f 6e 6e  = source.GetConn
59e0: 65 63 74 69 6f 6e 28 29 2e 47 65 74 53 63 68 65  ection().GetSche
59f0: 6d 61 28 22 54 61 62 6c 65 73 22 2c 20 6e 65 77  ma("Tables", new
5a00: 20 73 74 72 69 6e 67 5b 5d 20 7b 20 73 6f 75 72   string[] { sour
5a10: 63 65 2e 43 61 74 61 6c 6f 67 53 63 6f 70 65 20  ce.CatalogScope 
5a20: 7d 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  })).      {.    
5a30: 20 20 20 20 66 6f 72 65 61 63 68 20 28 44 61 74      foreach (Dat
5a40: 61 52 6f 77 20 72 6f 77 20 69 6e 20 74 61 62 6c  aRow row in tabl
5a50: 65 2e 52 6f 77 73 29 0a 20 20 20 20 20 20 20 20  e.Rows).        
5a60: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c  {.          bool
5a70: 20 61 64 64 20 3d 20 74 72 75 65 3b 0a 20 20 20   add = true;.   
5a80: 20 20 20 20 20 20 20 69 66 20 28 64 65 73 69 67         if (desig
5a90: 6e 20 21 3d 20 6e 75 6c 6c 20 26 26 20 28 72 6f  n != null && (ro
5aa0: 77 5b 32 5d 2e 54 6f 53 74 72 69 6e 67 28 29 20  w[2].ToString() 
5ab0: 3d 3d 20 64 65 73 69 67 6e 2e 4f 6c 64 4e 61 6d  == design.OldNam
5ac0: 65 20 7c 7c 20 72 6f 77 5b 32 5d 2e 54 6f 53 74  e || row[2].ToSt
5ad0: 72 69 6e 67 28 29 20 3d 3d 20 64 65 73 69 67 6e  ring() == design
5ae0: 2e 4e 61 6d 65 29 29 0a 20 20 20 20 20 20 20 20  .Name)).        
5af0: 20 20 20 20 61 64 64 20 3d 20 66 61 6c 73 65 3b      add = false;
5b00: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
5b10: 61 64 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  add) .          
5b20: 20 20 73 65 6c 65 63 74 6f 72 2e 41 64 64 4e 6f    selector.AddNo
5b30: 64 65 28 72 6f 77 5b 32 5d 2e 54 6f 53 74 72 69  de(row[2].ToStri
5b40: 6e 67 28 29 2c 20 72 6f 77 5b 32 5d 2c 20 6e 75  ng(), row[2], nu
5b50: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
5b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
5b70: 28 64 65 73 69 67 6e 20 21 3d 20 6e 75 6c 6c 29  (design != null)
5b80: 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 6f  .        selecto
5b90: 72 2e 41 64 64 4e 6f 64 65 28 64 65 73 69 67 6e  r.AddNode(design
5ba0: 2e 4e 61 6d 65 2c 20 64 65 73 69 67 6e 2e 4e 61  .Name, design.Na
5bb0: 6d 65 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 7d  me, null);.    }
5bc0: 0a 20 20 7d 0a 7d 0a                             .  }.}.