protected override void SetupLayoutConstraints()
        {
            base.SetupLayoutConstraints();

            this.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();

            this.AddConstraints(
                IconImageView.AtLeadingOf(this, 13),
                IconImageView.WithSameCenterY(this),
                IconImageView.Width().EqualTo(36),
                IconImageView.Height().EqualTo(36),
                RangeLabel.ToTrailingOf(IconImageView, 16),
                RangeLabel.AtTopOf(this, 16),
                TypeLabel.AtLeadingOf(RangeLabel),
                TypeLabel.Below(RangeLabel),
                ArrowImageView.WithSameCenterY(this),
                ArrowImageView.AtTrailingOf(this, 12),
                ArrowImageView.Width().EqualTo(8),
                ArrowImageView.Height().EqualTo(13),
                StateLabel.ToLeadingOf(ArrowImageView, 6),
                StateLabel.WithSameCenterY(this),
                MainDeviderView.Height().EqualTo(Theme.Dimensions.DeviderWidth),
                MainDeviderView.AtBottomOf(this),
                MainDeviderView.AtTrailingOf(this),
                MainDeviderView.WithSameLeading(RangeLabel),
                LastItemDeviderView.WithSameHeight(MainDeviderView),
                LastItemDeviderView.AtBottomOf(this),
                LastItemDeviderView.AtLeadingOf(this),
                LastItemDeviderView.ToLeadingOf(MainDeviderView));
        }
 private IEnumerable <RangeAndLabels> GetMatchingColumns(RangeLabel label)
 {
     // Get all columns where either the label start or end is contained or the label completely overlaps column
     return(_columns.Where(c =>
                           (c.ColumnRange.Min <= label.Start && label.Start < c.ColumnRange.Max) ||
                           (c.ColumnRange.Min < label.End && label.End <= c.ColumnRange.Max) ||
                           (label.Start <= c.ColumnRange.Min && c.ColumnRange.Max <= label.End)));
 }
        private int GetFirstEmptyRow(List <RangeAndLabels> matchingColumns, RangeLabel label)
        {
            int rowNo = 0;

            while (!matchingColumns.All(c => c.IsRowEmpty(rowNo)))
            {
                ++rowNo;
            }

            if (label != null)
            {
                foreach (var c in matchingColumns)
                {
                    c.Labels[rowNo] = label;
                }
            }

            return(rowNo);
        }