public void RefreshGameObjectTable()
        {
            GameObjectTable.Clear();

            Dictionary <GameObjectType, Dictionary <string, int> > nextX     = new Dictionary <GameObjectType, Dictionary <string, int> >();
            Dictionary <GameObjectType, Dictionary <string, int> > nextY     = new Dictionary <GameObjectType, Dictionary <string, int> >();
            Dictionary <GameObjectType, Dictionary <string, int> > maxHeight = new Dictionary <GameObjectType, Dictionary <string, int> >();

            foreach (GameObject gameObject in _project.GameObjects.Where(g => g != null).OrderBy(g => g.Name))
            {
                if (!nextX.ContainsKey(gameObject.GameObjectType))
                {
                    nextX[gameObject.GameObjectType]     = new Dictionary <string, int>();
                    nextY[gameObject.GameObjectType]     = new Dictionary <string, int>();
                    maxHeight[gameObject.GameObjectType] = new Dictionary <string, int>();
                }

                if (!nextX[gameObject.GameObjectType].ContainsKey(gameObject.Group))
                {
                    nextX[gameObject.GameObjectType][gameObject.Group]     = 0;
                    nextY[gameObject.GameObjectType][gameObject.Group]     = 0;
                    maxHeight[gameObject.GameObjectType][gameObject.Group] = 0;
                }

                var nextObject = new LevelObject()
                {
                    GameObjectId = gameObject.GameId,
                    GameObject   = gameObject,
                    X            = nextX[gameObject.GameObjectType][gameObject.Group],
                    Y            = nextY[gameObject.GameObjectType][gameObject.Group]
                };

                Rect rect = nextObject.CalcBoundBox();

                int actualX = (int)(rect.X / 16);
                int actualY = (int)(rect.Y / 16);

                if (nextObject.X - actualX >= 1)
                {
                    if (nextObject.X == 0)
                    {
                        nextObject.X += nextObject.X - actualX;
                    }
                    else
                    {
                        nextObject.X += (nextObject.X - actualX - 1);
                    }

                    rect = nextObject.CalcBoundBox();
                }

                if (nextObject.Y - actualY >= 1)
                {
                    nextObject.Y += (nextObject.Y - actualY - 1);
                    rect          = nextObject.CalcBoundBox();
                }

                if ((int)(rect.Height / 16) > maxHeight[gameObject.GameObjectType][gameObject.Group])
                {
                    maxHeight[gameObject.GameObjectType][gameObject.Group] = (int)(rect.Height / 16);
                }

                if (rect.X + rect.Width > 256)
                {
                    nextX[gameObject.GameObjectType][gameObject.Group] = nextObject.X = 0;
                    nextY[gameObject.GameObjectType][gameObject.Group] = nextObject.Y += maxHeight[gameObject.GameObjectType][gameObject.Group] + 1;
                    rect = nextObject.CalcBoundBox();
                }

                nextX[gameObject.GameObjectType][gameObject.Group] += (int)(rect.Width / 16) + (rect.Width % 16 > 0 ? 2 : 1);

                GameObjectTable.AddObject(gameObject.GameObjectType, gameObject.Group, nextObject);
            }
        }