private void FillTableItems(KeyValuePair <string, string> database, DatabaseTreeViewItem parentItem, IList <string> nameList)
        {
            parentItem.Items.Clear();

            if (DescriptionCache != null)
            {
                var dbdesc = DescriptionCache.Where(dc => dc.Parent == null && dc.Object == null).Select(dc => dc.Description).SingleOrDefault();
                if (!string.IsNullOrWhiteSpace(dbdesc))
                {
                    if (parentItem.Parent is DatabaseTreeViewItem)
                    {
                        var dbItem = (DatabaseTreeViewItem)parentItem.Parent;
                        dbItem.ToolTip = dbItem.ToolTip.ToString() + Environment.NewLine + dbdesc;
                    }
                }
            }

            using (var _repository = RepoHelper.CreateRepository(database.Value))
            {
                var columns = _repository.GetAllColumns();
                foreach (var table in nameList)
                {
                    if (!Properties.Settings.Default.DisplayDescriptionTable && table.Equals("__ExtendedProperties"))
                    {
                        continue;
                    }
                    var item = TreeViewHelper.CreateTreeViewItemWithImage(table, "../Resources/table.png", true, null, true);
                    item.ContextMenu = new TableContextMenu(new MenuCommandParameters {
                        Connectionstring = database.Value, Name = table, MenuItemType = MenuCommandParameters.MenuType.Table, Caption = database.Key
                    }, this);
                    item.ToolTip = table;
                    if (DescriptionCache != null)
                    {
                        var desc = DescriptionCache.Where(dc => dc.Parent == null && dc.Object == table).Select(dc => dc.Description).SingleOrDefault();
                        if (!string.IsNullOrWhiteSpace(desc))
                        {
                            item.ToolTip = desc;
                        }
                    }
                    var tableColumns = (from col in columns
                                        where col.TableName == table
                                        select col).ToList <Column>();
                    parentItem.Items.Add(item);
                    item.Expanded += (s, e) => GetTableColumns(s, e, tableColumns, database);
                }
            }
        }
        private void GetTableColumns(object sender, RoutedEventArgs args, List <Column> columns, KeyValuePair <string, string> database)
        {
            var viewItem = sender as DatabaseTreeViewItem;

            // Prevent loading again and again
            if (viewItem != null && (viewItem.Items.Count > 0 && viewItem.Items[0].ToString() == "Loading..."))
            {
                var tableName = viewItem.MetaData;

                viewItem.Items.Clear();

                using (var _repository = RepoHelper.CreateRepository(database.Value))
                {
                    // If the node is being refreshed by the user, make sure to reload the columns instead of using the cached ones from the
                    // previous load of the entire database tree
                    if (viewItem.IsRefreshing)
                    {
                        columns = _repository.GetAllColumns().Where(x => x.TableName == tableName).ToList();
                    }

                    var pkList = _repository.GetAllPrimaryKeys().Where(p => p.TableName == tableName);
                    var pks    = (from pk in pkList
                                  select pk.ColumnName).ToList <string>();

                    var fkList = _repository.GetAllForeignKeys().Where(fk => fk.ConstraintTableName == tableName).ToList();

                    foreach (var column in columns)
                    {
                        var display = column.ShortType;
                        var image   = "../Resources/column.png";

                        var constraints = (from fk in fkList
                                           where fk.Columns.Contains(column.ColumnName)
                                           select fk);
                        if (constraints.Count() > 0)
                        {
                            display = "FK, " + display;
                            image   = "../Resources/fk.png";
                        }
                        if (pks.Contains(column.ColumnName))
                        {
                            display = "PK, " + display;
                            image   = "../Resources/key.png";
                        }

                        string nullable = " not null)";
                        if (column.IsNullable == YesNoOption.YES)
                        {
                            nullable = " null)";
                        }
                        display = column.ColumnName + " (" + display + nullable;
                        var i = TreeViewHelper.CreateTreeViewItemWithImage(display, image, false);
                        i.ContextMenu = new ColumnContextMenu(new MenuCommandParameters {
                            Description = tableName, Connectionstring = database.Value, Name = column.ColumnName, MenuItemType = MenuCommandParameters.MenuType.Table
                        }, this);
                        i.ToolTip = column.ColumnName;
                        if (DescriptionCache != null)
                        {
                            var desc = DescriptionCache.Where(dc => dc.Parent == tableName && dc.Object == column.ColumnName).Select(dc => dc.Description).SingleOrDefault();
                            if (!string.IsNullOrWhiteSpace(desc))
                            {
                                i.ToolTip = desc;
                            }
                        }

                        viewItem.Items.Add(i);
                    }
                    var indexesItem = TreeViewHelper.CreateTreeViewItemWithImage("Indexes", "../Resources/folder.png", true);

                    indexesItem.Items.Clear();
                    string oldName = string.Empty;
                    foreach (var primaryKey in pkList)
                    {
                        if (oldName != primaryKey.KeyName)
                        {
                            var display   = primaryKey.KeyName + " (Primary Key)";
                            var indexItem = TreeViewHelper.CreateTreeViewItemWithImage(display, "../Resources/index.png", false);

                            indexItem.ContextMenu = new IndexContextMenu(new MenuCommandParameters {
                                Connectionstring = database.Value, Name = viewItem.MetaData, MenuItemType = MenuCommandParameters.MenuType.Table, Caption = primaryKey.KeyName
                            }, this);
                            indexItem.ToolTip = primaryKey.KeyName;
                            indexesItem.Items.Add(indexItem);
                            oldName = primaryKey.KeyName;
                        }
                    }

                    oldName = string.Empty;
                    var indexes = _repository.GetIndexesFromTable(viewItem.MetaData);

                    foreach (var index in indexes)
                    {
                        if (oldName != index.IndexName)
                        {
                            var display = string.Empty;
                            if (index.Unique)
                            {
                                display = index.IndexName + " (Unique)";
                            }
                            else
                            {
                                display = index.IndexName + " (Non-Unique)";
                            }
                            var indexItem = TreeViewHelper.CreateTreeViewItemWithImage(display, "../Resources/index.png", false);
                            indexItem.ContextMenu = new IndexContextMenu(new MenuCommandParameters {
                                Connectionstring = database.Value, Name = viewItem.MetaData, MenuItemType = MenuCommandParameters.MenuType.Table, Caption = index.IndexName
                            }, this);
                            indexItem.ToolTip = index.IndexName;
                            indexesItem.Items.Add(indexItem);
                            oldName = index.IndexName;
                        }
                    }
                    viewItem.Items.Add(indexesItem);
                }
            }
            args.Handled = true;
        }