private void AddRelationshipUICompositionItem(EntityUICompositionDTO parentItem, List <EntityUICompositionDTO> result, RelationshipDTO relationship, int index)
        {
            var childItem = new EntityUICompositionDTO();

            childItem.ObjectCategory        = DatabaseObjectCategory.Relationship;
            childItem.ObjectIdentity        = relationship.ID.ToString();
            childItem.Position              = index;
            childItem.Title                 = relationship.Alias;
            childItem.ParentItem            = parentItem;
            childItem.RelationshipUISetting = new RelationshipUISettingDTO();
            if (relationship.IsOtherSideCreatable && relationship.IsOtherSideDirectlyCreatable)
            {
                //if (relationship.MastertTypeEnum == Enum_MasterRelationshipType.FromForeignToPrimary)
                //{
                childItem.RelationshipUISetting.Expander      = relationship.MastertTypeEnum == Enum_MasterRelationshipType.FromForeignToPrimary;
                childItem.RelationshipUISetting.IsExpanded    = childItem.RelationshipUISetting.Expander == true;
                childItem.RelationshipUISetting.UIColumnsType = Enum_UIColumnsType.Full;
                //}
                //else
                //{
                //if (relationship.TypeEnum == Enum_RelationshipType.OneToMany)
                //{
                //    AddTabPageUICompositionItem(result[0], result, relationship, index)
                //}
                //}
            }
            else
            {
                childItem.RelationshipUISetting.UIColumnsType = Enum_UIColumnsType.Half;
            }
            result.Add(childItem);
        }
        private void AddPrimaryToForeignRelationshipUICompositionItem(EntityUICompositionDTO parentItem, List <EntityUICompositionDTO> result, List <RelationshipDTO> list, int index)
        {
            EntityUICompositionDTO tabConrol = null;

            foreach (var relationship in list)
            {
                if (relationship.IsOtherSideCreatable && relationship.IsOtherSideDirectlyCreatable)
                {
                    if (tabConrol == null)
                    {
                        tabConrol = CreateRelationshipTabControl(parentItem, index);
                    }
                    AddTabPageRelationship(tabConrol, relationship, result);
                }
                else
                {
                    AddRelationshipUICompositionItem(parentItem, result, relationship, index);
                    index++;
                }
            }
            if (tabConrol != null)
            {
                //tabConrol.Position = index;
                result.Add(tabConrol);
            }
        }
        private EntityUICompositionDTO GetOrCreateRelationshipTabControl(EntityUICompositionDTO rootItem)
        {
            var foundTabControl = FindTabControl(rootItem);

            if (foundTabControl == null)
            {
                foundTabControl = CreateRelationshipTabControl(rootItem, rootItem.ChildItems.Max(x => x.Position) + 1);
            }
            return(foundTabControl);
        }
        private void AddTabPageRelationship(EntityUICompositionDTO tabConrol, RelationshipDTO relationship, List <EntityUICompositionDTO> result)
        {
            var tabPage = new EntityUICompositionDTO();

            tabPage.ObjectCategory   = DatabaseObjectCategory.TabPage;
            tabPage.ParentItem       = tabConrol;
            tabPage.Title            = relationship.Alias;
            tabPage.TabPageUISetting = new TabPageUISettingDTO()
            {
                InternalColumnsCount = 4
            };
            result.Add(tabPage);
            AddRelationshipUICompositionItem(tabPage, result, relationship, 0);
        }
        private EntityUICompositionDTO CreateRelationshipTabControl(EntityUICompositionDTO rootItem, int index)
        {
            var tabConrol = new EntityUICompositionDTO();

            tabConrol.ObjectCategory    = DatabaseObjectCategory.TabControl;
            tabConrol.TabGroupUISetting = new TabGroupUISettingDTO()
            {
                UIColumnsType = Enum_UIColumnsType.Full
            };
            tabConrol.Title          = "روابط";
            tabConrol.ObjectIdentity = "-99";
            tabConrol.ParentItem     = rootItem;
            tabConrol.Position       = index;
            return(tabConrol);
        }
        private void AddColumnUICompositionItem(EntityUICompositionDTO parentItem, List <EntityUICompositionDTO> result, ColumnDTO column, int index)
        {
            var childItem = new EntityUICompositionDTO();

            childItem.ObjectCategory  = DatabaseObjectCategory.Column;
            childItem.ObjectIdentity  = column.ID.ToString();
            childItem.Position        = index;
            childItem.Title           = column.Alias;
            childItem.ParentItem      = parentItem;
            childItem.ColumnUISetting = new ColumnUISettingDTO();
            if (column.ColumnType != Enum_ColumnType.String)
            {
                childItem.ColumnUISetting.UIColumnsType = Enum_UIColumnsType.Normal;
            }
            else
            {
                if (column.StringColumnType.MaxLength == -1)
                {
                    childItem.ColumnUISetting.UIColumnsType = Enum_UIColumnsType.Full;
                    childItem.ColumnUISetting.UIRowsCount   = 3;
                }
                else
                {
                    if (column.StringColumnType.MaxLength <= 64)
                    {
                        childItem.ColumnUISetting.UIColumnsType = Enum_UIColumnsType.Normal;
                    }
                    else if (column.StringColumnType.MaxLength > 64 && column.StringColumnType.MaxLength <= 512)
                    {
                        childItem.ColumnUISetting.UIColumnsType = Enum_UIColumnsType.Half;
                    }
                    else if (column.StringColumnType.MaxLength > 512 && column.StringColumnType.MaxLength <= 1024)
                    {
                        childItem.ColumnUISetting.UIColumnsType = Enum_UIColumnsType.Full;
                    }
                    else if (column.StringColumnType.MaxLength > 1024)
                    {
                        childItem.ColumnUISetting.UIColumnsType = Enum_UIColumnsType.Full;
                        childItem.ColumnUISetting.UIRowsCount   = 2;
                    }
                }
            }
            result.Add(childItem);
        }
        private bool RelationshipExistsInTree(EntityUICompositionDTO rootItem, RelationshipDTO relationship)
        {
            if (rootItem.ObjectCategory == DatabaseObjectCategory.Relationship)
            {
                if (rootItem.ObjectIdentity == relationship.ID.ToString())
                {
                    return(true);
                }
            }

            foreach (var item in rootItem.ChildItems)
            {
                if (RelationshipExistsInTree(item, relationship))
                {
                    return(true);
                }
            }
            return(false);
        }
 private EntityUICompositionDTO FindTabControl(EntityUICompositionDTO rootItem)
 {
     if (rootItem.ObjectCategory == DatabaseObjectCategory.TabControl)
     {
         if (rootItem.ObjectIdentity == "-99")
         {
             return(rootItem);
         }
     }
     foreach (var item in rootItem.ChildItems)
     {
         var findInChild = FindTabControl(item);
         if (findInChild != null)
         {
             return(findInChild);
         }
     }
     return(null);
 }
        public List <EntityUICompositionDTO> GenerateUIComposition(TableDrivedEntityDTO entity)
        {
            List <EntityUICompositionDTO> result = new List <EntityUICompositionDTO>();
            var entityUiComposition = new EntityUICompositionDTO();

            entityUiComposition.ObjectCategory  = DatabaseObjectCategory.Entity;
            entityUiComposition.EntityUISetting = new EntityUISettingDTO()
            {
                UIColumnsCount = 4
            };
            entityUiComposition.ObjectIdentity = entity.ID.ToString();
            result.Add(entityUiComposition);
            List <RelationshipDTO> listFTPRelationships = new List <RelationshipDTO>();
            int index = 0;

            foreach (var item in entity.Columns.OrderBy(x => x.Position))
            {
                if (!listFTPRelationships.Any(x => x.RelationshipColumns.Any(y => y.FirstSideColumnID == item.ID)))
                {
                    if (entity.Relationships.Any(x => x.DataEntryEnabled == true && x.MastertTypeEnum == Enum_MasterRelationshipType.FromForeignToPrimary && x.RelationshipColumns.Any(y => y.FirstSideColumnID == item.ID)))
                    {
                        var relationship = entity.Relationships.First(x => x.MastertTypeEnum == Enum_MasterRelationshipType.FromForeignToPrimary && x.RelationshipColumns.Any(y => y.FirstSideColumnID == item.ID));
                        listFTPRelationships.Add(relationship);
                        AddRelationshipUICompositionItem(result[0], result, relationship, index);
                        index++;
                    }
                    else
                    {
                        AddColumnUICompositionItem(result[0], result, item, index);
                        index++;
                    }
                }
            }
            AddPrimaryToForeignRelationshipUICompositionItem(result[0], result, entity.Relationships.Where(x => x.DataEntryEnabled == true && x.MastertTypeEnum == Enum_MasterRelationshipType.FromPrimartyToForeign).ToList(), index);
            return(result);
        }
        //public List<EntityUICompositionDTO> GetEntityUIComposition(int? parentID)
        //{
        //    List<EntityUICompositionDTO> result = new List<EntityUICompositionDTO>();
        //    using (var projectContext = new DataAccess.MyProjectEntities())
        //    {
        //        var list = projectContext.EntityUIComposition.Where(x => x.ParentID == parentID);
        //        foreach (var item in list)
        //        {
        //            result.Add(ToEntityUICompositionDTO(item, false));
        //        }
        //    }
        //    return result;
        //}

        private EntityUICompositionDTO ToEntityUICompositionDTO(DataAccess.EntityUIComposition item, bool withChilds, List <ColumnUISettingDTO> columnItems = null, List <RelationshipUISettingDTO> relationshipItems = null)
        {
            var result = new EntityUICompositionDTO();

            result.ID             = item.ID;
            result.ParentID       = item.ParentID;
            result.ObjectIdentity = item.ItemIdentity;
            result.Title          = item.ItemTitle;
            result.ObjectCategory = (DatabaseObjectCategory)Enum.Parse(typeof(DatabaseObjectCategory), item.Category);
            result.Position       = item.Position;
            if (result.ObjectCategory == DatabaseObjectCategory.Entity)
            {
                if (item.EntityUISetting != null)
                {
                    result.EntityUISetting                = new EntityUISettingDTO();
                    result.EntityUISetting.ID             = item.EntityUISetting.ID;
                    result.EntityUISetting.UIColumnsCount = item.EntityUISetting.UIColumnsCount;
                }
            }
            else if (result.ObjectCategory == DatabaseObjectCategory.Column)
            {
                if (item.ColumnUISetting != null)
                {
                    result.ColumnUISetting               = new ColumnUISettingDTO();
                    result.ColumnUISetting.ID            = item.ColumnUISetting.ID;
                    result.ColumnUISetting.ColumnID      = Convert.ToInt32(item.ItemIdentity);
                    result.ColumnUISetting.UIColumnsType = (Enum_UIColumnsType)item.ColumnUISetting.UIColumnsType;
                    result.ColumnUISetting.UIRowsCount   = item.ColumnUISetting.UIRowsCount;
                    if (columnItems != null)
                    {
                        columnItems.Add(result.ColumnUISetting);
                    }
                }
            }
            else if (result.ObjectCategory == DatabaseObjectCategory.Relationship)
            {
                if (item.RelationshipUISetting != null)
                {
                    result.RelationshipUISetting                = new RelationshipUISettingDTO();
                    result.RelationshipUISetting.ID             = item.RelationshipUISetting.ID;
                    result.RelationshipUISetting.RelationshipID = Convert.ToInt32(item.ItemIdentity);
                    result.RelationshipUISetting.UIColumnsType  = (Enum_UIColumnsType)item.RelationshipUISetting.UIColumnsType;
                    result.RelationshipUISetting.Expander       = item.RelationshipUISetting.Expander;
                    result.RelationshipUISetting.IsExpanded     = item.RelationshipUISetting.IsExpanded == true;
                    result.RelationshipUISetting.UIRowsCount    = Convert.ToInt16(item.RelationshipUISetting.UIRowsCount);
                    if (relationshipItems != null)
                    {
                        relationshipItems.Add(result.RelationshipUISetting);
                    }
                }
            }
            else if (result.ObjectCategory == DatabaseObjectCategory.Group)
            {
                if (item.GroupUISetting != null)
                {
                    result.GroupUISetting               = new GroupUISettingDTO();
                    result.GroupUISetting.ID            = item.GroupUISetting.ID;
                    result.GroupUISetting.UIColumnsType = (Enum_UIColumnsType)item.GroupUISetting.UIColumnsType;
                    result.GroupUISetting.Expander      = item.GroupUISetting.Expander;
                    result.GroupUISetting.IsExpanded    = item.GroupUISetting.IsExpanded == true;

                    result.GroupUISetting.InternalColumnsCount = item.GroupUISetting.InternalColumnsCount;
                    result.GroupUISetting.UIRowsCount          = Convert.ToInt16(item.GroupUISetting.UIRowsCount);
                }
            }
            else if (result.ObjectCategory == DatabaseObjectCategory.TabControl)
            {
                if (item.TabGroupUISetting != null)
                {
                    result.TabGroupUISetting               = new TabGroupUISettingDTO();
                    result.TabGroupUISetting.ID            = item.TabGroupUISetting.ID;
                    result.TabGroupUISetting.UIColumnsType = (Enum_UIColumnsType)item.TabGroupUISetting.UIColumnsType;
                    result.TabGroupUISetting.Expander      = item.TabGroupUISetting.Expander;
                    result.TabGroupUISetting.IsExpanded    = item.TabGroupUISetting.IsExpanded == true;

                    result.TabGroupUISetting.UIRowsCount = Convert.ToInt16(item.TabGroupUISetting.UIRowsCount);
                }
            }
            else if (result.ObjectCategory == DatabaseObjectCategory.TabPage)
            {
                if (item.TabPageUISetting != null)
                {
                    result.TabPageUISetting    = new TabPageUISettingDTO();
                    result.TabPageUISetting.ID = item.TabPageUISetting.ID;
                    result.TabPageUISetting.InternalColumnsCount = item.TabPageUISetting.InternalColumnsCount;
                }
            }
            else if (result.ObjectCategory == DatabaseObjectCategory.EmptySpace)
            {
                if (item.EmptySpaceUISetting != null)
                {
                    result.EmptySpaceUISetting               = new EmptySpaceUISettingDTO();
                    result.EmptySpaceUISetting.ID            = item.EmptySpaceUISetting.ID;
                    result.EmptySpaceUISetting.UIColumnsType = (Enum_UIColumnsType)item.EmptySpaceUISetting.UIColumnsType;
                    result.EmptySpaceUISetting.ExpandToEnd   = item.EmptySpaceUISetting.ExtendToEnd;
                }
            }
            result.ChildItems = new List <EntityUICompositionDTO>();
            if (withChilds)
            {
                foreach (var citem in item.EntityUIComposition1)
                {
                    result.ChildItems.Add(ToEntityUICompositionDTO(citem, withChilds, columnItems, relationshipItems));
                }
            }

            return(result);
        }
        private void CheckAddItems(int entityID, List <EntityUICompositionDTO> items, EntityUICompositionDTO parentItem, EntityUIComposition parentDBItem, DataAccess.MyProjectEntities projectContext)
        {
            foreach (var item in items.Where(x => x.ParentItem == parentItem))
            {
                EntityUIComposition dbItem = null;
                if (item.ID != 0)
                {
                    dbItem = projectContext.EntityUIComposition.First(x => x.ID == item.ID);
                }
                else
                {
                    dbItem = new EntityUIComposition();
                    projectContext.EntityUIComposition.Add(dbItem);
                }
                dbItem.TableDrivedEntityID = entityID;
                dbItem.Category            = item.ObjectCategory.ToString();
                if (item.ObjectCategory == DatabaseObjectCategory.Entity)
                {
                    if (dbItem.EntityUISetting == null)
                    {
                        dbItem.EntityUISetting = new EntityUISetting();
                    }
                    dbItem.EntityUISetting.UIColumnsCount = item.EntityUISetting.UIColumnsCount;
                }
                else if (item.ObjectCategory == DatabaseObjectCategory.Column)
                {
                    if (dbItem.ColumnUISetting == null)
                    {
                        dbItem.ColumnUISetting = new ColumnUISetting();
                    }
                    dbItem.ColumnUISetting.UIColumnsType = (short)item.ColumnUISetting.UIColumnsType;
                    dbItem.ColumnUISetting.UIRowsCount   = item.ColumnUISetting.UIRowsCount;
                }
                else if (item.ObjectCategory == DatabaseObjectCategory.Relationship)
                {
                    if (dbItem.RelationshipUISetting == null)
                    {
                        dbItem.RelationshipUISetting = new RelationshipUISetting();
                    }
                    dbItem.RelationshipUISetting.UIColumnsType = (short)item.RelationshipUISetting.UIColumnsType;
                    dbItem.RelationshipUISetting.Expander      = item.RelationshipUISetting.Expander;
                    dbItem.RelationshipUISetting.IsExpanded    = item.RelationshipUISetting.IsExpanded;
                    dbItem.RelationshipUISetting.UIRowsCount   = item.RelationshipUISetting.UIRowsCount;
                }
                else if (item.ObjectCategory == DatabaseObjectCategory.Group)
                {
                    if (dbItem.GroupUISetting == null)
                    {
                        dbItem.GroupUISetting = new GroupUISetting();
                    }
                    dbItem.GroupUISetting.UIColumnsType = (short)item.GroupUISetting.UIColumnsType;
                    dbItem.GroupUISetting.Expander      = item.GroupUISetting.Expander;
                    dbItem.GroupUISetting.IsExpanded    = item.GroupUISetting.IsExpanded;

                    dbItem.GroupUISetting.InternalColumnsCount = item.GroupUISetting.InternalColumnsCount;
                    dbItem.GroupUISetting.UIRowsCount          = item.GroupUISetting.UIRowsCount;
                }
                else if (item.ObjectCategory == DatabaseObjectCategory.TabControl)
                {
                    if (dbItem.TabGroupUISetting == null)
                    {
                        dbItem.TabGroupUISetting = new TabGroupUISetting();
                    }
                    dbItem.TabGroupUISetting.UIColumnsType = (short)item.TabGroupUISetting.UIColumnsType;
                    dbItem.TabGroupUISetting.Expander      = item.TabGroupUISetting.Expander;
                    dbItem.TabGroupUISetting.IsExpanded    = item.TabGroupUISetting.IsExpanded;

                    dbItem.TabGroupUISetting.UIRowsCount = item.TabGroupUISetting.UIRowsCount;
                }
                else if (item.ObjectCategory == DatabaseObjectCategory.TabPage)
                {
                    if (dbItem.TabPageUISetting == null)
                    {
                        dbItem.TabPageUISetting = new TabPageUISetting();
                    }
                    dbItem.TabPageUISetting.InternalColumnsCount = item.TabPageUISetting.InternalColumnsCount;
                }
                else if (item.ObjectCategory == DatabaseObjectCategory.EmptySpace)
                {
                    if (dbItem.EmptySpaceUISetting == null)
                    {
                        dbItem.EmptySpaceUISetting = new EmptySpaceUISetting();
                    }
                    dbItem.EmptySpaceUISetting.UIColumnsType = (short)item.EmptySpaceUISetting.UIColumnsType;
                    dbItem.EmptySpaceUISetting.ExtendToEnd   = item.EmptySpaceUISetting.ExpandToEnd;
                }
                dbItem.ItemTitle            = item.Title;
                dbItem.Position             = item.Position;
                dbItem.ItemIdentity         = item.ObjectIdentity ?? item.Title;
                dbItem.EntityUIComposition2 = parentDBItem;
                CheckAddItems(entityID, items, item, dbItem, projectContext);
            }
        }