public static IModelUI CreatePlacemat(this ElementBuilder elementBuilder, CommandDispatcher commandDispatcher, IPlacematModel model)
        {
            var ui = new Placemat();

            ui.SetupBuildAndUpdate(model, commandDispatcher, elementBuilder.View, elementBuilder.Context);
            return(ui);
        }
        void GetPlacematsBoundingRects(ref List <Tuple <Rect, List <IGraphElementModel> > > boundingRects)
        {
            List <IPlacematModel> selectedPlacemats = m_SelectedElementModels.OfType <IPlacematModel>().ToList();

            foreach (var placemat in selectedPlacemats.Where(placemat => m_LeftOverElementModels.Contains(placemat)))
            {
                Placemat placematUI = placemat.GetUI <Placemat>(m_GraphView);
                if (placematUI != null)
                {
                    var boundingRect = GetPlacematBoundingRect(ref boundingRects, placematUI, selectedPlacemats);
                    boundingRects.Add(new Tuple <Rect, List <IGraphElementModel> >(boundingRect.Key, boundingRect.Value));
                }
            }
        }
        List <Placemat> GetPlacematsOnBoundingRect(ref Rect boundingRect, ref List <IGraphElementModel> elementsOnBoundingRect, List <IPlacematModel> selectedPlacemats)
        {
            List <Placemat> placematsOnBoundingRect = new List <Placemat>();

            foreach (IPlacematModel placemat in selectedPlacemats.Where(placemat => m_LeftOverElementModels.Contains(placemat)))
            {
                Placemat placematUI = placemat.GetUI <Placemat>(m_GraphView);
                if (placematUI != null && placematUI.layout.Overlaps(boundingRect))
                {
                    AdjustBoundingRect(ref boundingRect, placematUI.GetPosition());

                    placematsOnBoundingRect.Add(placematUI);
                    elementsOnBoundingRect.Add(placemat);
                    m_LeftOverElementModels.Remove(placemat);
                }
            }

            return(placematsOnBoundingRect);
        }
        KeyValuePair <Rect, List <IGraphElementModel> > GetPlacematBoundingRect(ref List <Tuple <Rect, List <IGraphElementModel> > > boundingRects, Placemat placematUI, List <IPlacematModel> selectedPlacemats)
        {
            Rect boundingRect = placematUI.GetPosition();
            List <IGraphElementModel> elementsOnBoundingRect  = new List <IGraphElementModel>();
            List <Placemat>           placematsOnBoundingRect = GetPlacematsOnBoundingRect(ref boundingRect, ref elementsOnBoundingRect, selectedPlacemats);

            // Adjust the bounding rect with elements overlapping any of the placemats on the bounding rect
            AdjustPlacematBoundingRect(ref boundingRect, ref elementsOnBoundingRect, placematsOnBoundingRect);

            foreach (var otherRect in boundingRects.ToList())
            {
                Rect otherBoundingRect = otherRect.Item1;
                List <IGraphElementModel> otherBoundingRectElements = otherRect.Item2;
                if (otherBoundingRectElements.Any(element => IsOnPlacemats(element.GetUI <GraphElement>(m_GraphView), placematsOnBoundingRect)))
                {
                    AdjustBoundingRect(ref boundingRect, otherBoundingRect);
                    elementsOnBoundingRect.AddRange(otherBoundingRectElements);
                    boundingRects.Remove(otherRect);
                }
            }

            return(new KeyValuePair <Rect, List <IGraphElementModel> >(boundingRect, elementsOnBoundingRect));
        }