/// <summary>
 /// Initializes a new instance of the <see cref="OutlookGridDefaultGroup"/> class.
 /// </summary>
 public OutlookGridDefaultGroup()
 {
     val    = null;
     column = null;
     if (KryptonManager.CurrentGlobalPalette.GetRenderer() == KryptonManager.RenderOffice2013)
     {
         height = StaticValues._2013GroupRowHeight; // special height for office 2013
     }
     else
     {
         height = StaticValues._defaultGroupRowHeight; // default height
     }
     rows                   = new List <OutlookGridRow>();
     children               = new OutlookGridGroupCollection();
     formatStyle            = "";
     oneItemText            = LangManager.Instance.GetString("OneItem");
     XXXItemsText           = LangManager.Instance.GetString("XXXItems");
     allowHiddenWhenGrouped = true;
     sortBySummaryCount     = false;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="OutlookGridDefaultGroup"/> class.
 /// </summary>
 public OutlookGridDefaultGroup()
 {
     val = null;
     column = null;
     if (KryptonManager.CurrentGlobalPalette.GetRenderer() == KryptonManager.RenderOffice2013)
         height = StaticValues._2013GroupRowHeight; // special height for office 2013
     else
         height = StaticValues._defaultGroupRowHeight; // default height
     rows = new List<OutlookGridRow>();
     children = new OutlookGridGroupCollection();
     formatStyle = "";
     oneItemText = LangManager.Instance.GetString("OneItem");
     XXXItemsText = LangManager.Instance.GetString("XXXItems");
     allowHiddenWhenGrouped = true;
     sortBySummaryCount = false;
 }
        /// <summary>
        /// Sort recursively the OutlookGridRows within groups
        /// </summary>
        /// <param name="groupCollection">The OutlookGridGroupCollection.</param>
        /// <param name="sortList">The list of sorted columns</param>
        private void RecursiveSort(OutlookGridGroupCollection groupCollection, List<Tuple<int, SortOrder, IComparer>> sortList)
        {
            //We sort the groups
            if (groupCollection.Count > 0)
            {
                if (groupCollection[0].Column.GroupingType.SortBySummaryCount)
                    groupCollection.Sort(new OutlookGridGroupCountComparer());
                else
                    groupCollection.Sort();
            }

            //Sort the rows inside each group
            for (int i = 0; i < groupCollection.Count; i++)
            {
                //If there is no child group then we have only rows...
                if ((groupCollection[i].Children.Count == 0) && sortList.Count > 0)
                {
                    //We sort the rows according to the sorted only columns
                    groupCollection[i].Rows.Sort(new OutlookGridRowComparer2(sortList));
                }
                //else
                //{
                //    Console.WriteLine("groupCollection[i].Rows" + groupCollection[i].Rows.Count.ToString());
                //    //We sort the rows according to the group sort (useful for alphbetics for example)
                //    groupCollection[i].Rows.Sort(new OutlookGridRowComparer(groupCollection[i].Column.DataGridViewColumn.Index, internalColumns[groupCollection[i].Column.DataGridViewColumn.Name].SortDirection));
                //}

                //Recursive call for children
                RecursiveSort(groupCollection[i].Children, sortList);
            }
        }
 private void RecursiveSetGroupCollapse(string c, OutlookGridGroupCollection col, bool collapsed)
 {
     for (int i = 0; i < col.Count; i++)
     {
         if (col[i].Column.Name == c)
             col[i].Collapsed = collapsed;
         RecursiveSetGroupCollapse(c, col[i].Children, collapsed);
     }
 }
 private void RecursiveSetGroupCollapse(OutlookGridGroupCollection col, bool collapsed)
 {
     for (int i = 0; i < col.Count; i++)
     {
         col[i].Collapsed = collapsed;
         RecursiveSetGroupCollapse(col[i].Children, collapsed);
     }
 }
        /// <summary>
        /// Transform a group in a list of OutlookGridRows. Recursive call
        /// </summary>
        /// <param name="l">The OutlookGridGroupCollection that contains the groups and associated rows.</param>
        /// <param name="tmp">A List of OutlookGridRow</param>
        private void RecursiveFillOutlookGridRows(OutlookGridGroupCollection l, List<OutlookGridRow> tmp)
        {
            OutlookGridRow grRow;
            IOutlookGridGroup gr;

            //for each group
            for (int i = 0; i < l.List.Count; i++)
            {
                gr = l.List[i];

                //Create the group row
                grRow = (OutlookGridRow)RowTemplate.Clone();
                grRow.Group = gr;
                grRow.IsGroupRow = true;
                grRow.Height = gr.Height;
                grRow.MinimumHeight = grRow.Height; //To handle auto resize rows correctly on high dpi
                grRow.CreateCells(this, gr.Value);
                tmp.Add(grRow);

                //Recusive call
                if (gr.Children.Count > 0)
                {
                    RecursiveFillOutlookGridRows(gr.Children, tmp);
                }

                //We add the rows associated with the current group
                if (_fillMode == FillMode.GroupsOnly)
                {
                    tmp.AddRange(gr.Rows);
                }
                else
                {
                    NonGroupedRecursiveFillOutlookGridRows(gr.Rows, tmp);
                }

            }
        }
        /// <summary>
        /// Constructor
        /// </summary>
        public KryptonOutlookGrid()
        {
            InitializeComponent();

            // very important, this indicates that a new default row class is going to be used to fill the grid
            // in this case our custom OutlookGridRow class
            base.RowTemplate = new OutlookGridRow();
            groupCollection = new OutlookGridGroupCollection(null);
            internalRows = new List<OutlookGridRow>();
            internalColumns = new OutlookGridColumnCollection();

            // Cache the current global palette setting
            _palette = KryptonManager.CurrentGlobalPalette;

            // Hook into palette events
            if (_palette != null)
                _palette.PalettePaint += new EventHandler<PaletteLayoutEventArgs>(OnPalettePaint);

            // (4) We want to be notified whenever the global palette changes
            KryptonManager.GlobalPaletteChanged += new EventHandler(OnGlobalPaletteChanged);

            // Create redirection object to the base palette
            _paletteRedirect = new PaletteRedirect(_palette);

            // Create accessor objects for the back, border and content
            _paletteBack = new PaletteBackInheritRedirect(_paletteRedirect);
            _paletteBorder = new PaletteBorderInheritRedirect(_paletteRedirect);
            //_paletteContent = new PaletteContentInheritRedirect(_paletteRedirect);

            AllowUserToOrderColumns = false;  //we will handle it ourselves
            _hideColumnOnGrouping = false;
            formatConditions = new List<ConditionalFormatting>();

            using (Graphics g = CreateGraphics())
            {
                factorX = g.DpiX > 96 ? (1f * g.DpiX / 96) : 1f;
                factorY = g.DpiY > 96 ? (1f * g.DpiY / 96) : 1f;
            }

            //Update StaticValues
            //ColumnHeadersHeight = (int)(ColumnHeadersHeight * factorY); //No need already done in KryptonDataGridView
            StaticValues._defaultGroupRowHeight = (int)(StaticValues._defaultGroupRowHeight * factorY);
            StaticValues._2013GroupRowHeight = (int)(StaticValues._2013GroupRowHeight * factorY);
            StaticValues._defaultOffsetHeight = (int)(StaticValues._defaultOffsetHeight * factorY);
            StaticValues._2013OffsetHeight = (int)(StaticValues._defaultOffsetHeight * factorY);
            StaticValues._ImageOffsetwidth = (int)(StaticValues._ImageOffsetwidth * factorX);
            StaticValues._groupLevelMultiplier = (int)(StaticValues._groupLevelMultiplier * factorX);
            StaticValues._groupImageSide = (int)(StaticValues._groupImageSide * factorX);
        }