public void KarnaughTableObject(CKarnaughTable newObject)
        {
            if (newObject.GetTableType() == EKarnaughTableType.Karnaugh3Var)
            {
                // 3 var table
                m_rowsCount            = 2;
                m_strLableBits_Rows[0] = "0";
                m_strLableBits_Rows[1] = "1";
            }
            else
            {
                // 4 var table
                m_rowsCount            = 4;
                m_strLableBits_Rows[0] = "00";
                m_strLableBits_Rows[1] = "01";
            }


            m_objKarnaugh = newObject;
            CalculateCellsLocation();
            this.Invalidate();
        }
        private Rectangle[] GetGroupRegions(SKarnaughGroup group)
        {
            Rectangle[] reg;

            if (group.Type == EGroupTypes.RectGroup_4 && group.Location == 10)
            {
                #region We must return 4 region
                reg    = new Rectangle[4];
                reg[0] = GetMintermLocation(0);
                reg[1] = GetMintermLocation(2);
                reg[2] = GetMintermLocation(8);
                reg[3] = GetMintermLocation(10);

                #endregion
            }
            else if ((group.Location % 4 == 2 && (group.Type == EGroupTypes.LinerGroup_2_Hor ||
                                                  group.Type == EGroupTypes.RectGroup_4 ||
                                                  group.Type == EGroupTypes.RectGroup_8_Ver)) ||
                     ((group.Location >= 8 && group.Location <= 11) && (group.Type == EGroupTypes.LinerGroup_2_Ver ||
                                                                        group.Type == EGroupTypes.RectGroup_4 ||
                                                                        group.Type == EGroupTypes.RectGroup_8_Hor)))
            {
                #region We must return 2 region
                reg = new Rectangle[2];
                SKarnaughGroup g1, g2;
                Rectangle[]    reg1;
                Rectangle[]    reg2;
                switch (group.Type)
                {
                case EGroupTypes.RectGroup_8_Ver:
                    g1.Type     = g2.Type = EGroupTypes.LinerGroup_4_Ver;
                    g1.Location = 0;
                    g2.Location = 2;

                    reg1 = GetGroupRegions(g1);
                    reg2 = GetGroupRegions(g2);

                    reg[0] = reg1[0];
                    reg[1] = reg2[0];
                    break;

                case EGroupTypes.RectGroup_8_Hor:
                    g1.Type     = g2.Type = EGroupTypes.LinerGroup_4_Hor;
                    g1.Location = 0;
                    g2.Location = 8;

                    reg1 = GetGroupRegions(g1);
                    reg2 = GetGroupRegions(g2);

                    reg[0] = reg1[0];
                    reg[1] = reg2[0];
                    break;

                case EGroupTypes.RectGroup_4:
                    if (group.Location == 2 || group.Location == 6 || group.Location == 14)
                    {
                        g1.Type     = g2.Type = EGroupTypes.LinerGroup_2_Ver;
                        g1.Location = group.Location - 2;
                        g2.Location = group.Location;

                        reg1 = GetGroupRegions(g1);
                        reg2 = GetGroupRegions(g2);

                        reg[0] = reg1[0];
                        reg[1] = reg2[0];
                    }
                    else if (group.Location == 8 || group.Location == 9 || group.Location == 11)
                    {
                        g1.Type     = g2.Type = EGroupTypes.LinerGroup_2_Hor;
                        g1.Location = group.Location - 8;
                        g2.Location = group.Location;

                        reg1 = GetGroupRegions(g1);
                        reg2 = GetGroupRegions(g2);

                        reg[0] = reg1[0];
                        reg[1] = reg2[0];
                    }

                    break;

                case EGroupTypes.LinerGroup_2_Hor:
                    g1.Type     = g2.Type = EGroupTypes.SingleMinterm;
                    g1.Location = group.Location - 2;
                    g2.Location = group.Location;

                    reg1 = GetGroupRegions(g1);
                    reg2 = GetGroupRegions(g2);

                    reg[0] = reg1[0];
                    reg[1] = reg2[0];
                    break;

                case EGroupTypes.LinerGroup_2_Ver:
                    g1.Type     = g2.Type = EGroupTypes.SingleMinterm;
                    g1.Location = group.Location - 8;
                    g2.Location = group.Location;

                    reg1 = GetGroupRegions(g1);
                    reg2 = GetGroupRegions(g2);

                    reg[0] = reg1[0];
                    reg[1] = reg2[0];
                    break;
                }
                #endregion
            }
            else
            {
                #region We must return 1 region
                Rectangle currentRegion;
                int[]     mintermIndexes = CKarnaughTable.GetMintermsIndexes(CKarnaughTable.GetMintermsInsideGroup(group));
                int       regionsCount   = mintermIndexes.GetLength(0);
                reg = new Rectangle[1];

                reg[0] = GetMintermLocation(mintermIndexes[0]);
                for (int i = 1; i < regionsCount; i++)
                {
                    currentRegion = GetMintermLocation(mintermIndexes[i]);
                    if (currentRegion.Left < reg[0].Left)
                    {
                        reg[0].X = currentRegion.Left;
                    }
                    if (currentRegion.Top < reg[0].Top)
                    {
                        reg[0].Y = currentRegion.Top;
                    }
                    if (currentRegion.Right > reg[0].Right)
                    {
                        reg[0].Width = currentRegion.Right - reg[0].Left;
                    }
                    if (currentRegion.Bottom > reg[0].Bottom)
                    {
                        reg[0].Height = currentRegion.Bottom - reg[0].Top;
                    }
                }
                #endregion
            }


            return(reg);
        }