Esempio n. 1
0
        public void Evict()
        {
            if (_chunks == null)
            {
                return;
            }
            Save();
            State = ColumnState.Evicting;
            for (var y = 0; y < _chunks.Count; ++y)
            {
                if (!_chunks[y].Equals(default(IChunk)))
                {
                    var chunk = _chunks[y];
                    chunk.Evict();
                }
                _chunks[y] = default(IChunk);
            }

            if (_lightData != null)
            {
                _lightData.Evict();
                PoolManager.GetObjectPool <CompressableArray <uint> >().Push(_lightData);
            }
            if (_neighbors != null)
            {
                _neighbors.Clear();
                PoolManager.GetObjectPool <Dictionary <FaceDirection, Column> >().Push(_neighbors);
            }
            PoolManager.GetObjectPool <List <IChunk> >().Push(_chunks);
            _lightData = null;
            _chunks    = null;
            State      = ColumnState.Uninitialized;
        }
 public static ColumnState[] GetState(GridViewColumnCollection columns)
 {
     ColumnState[] state = new ColumnState[columns.Count];
     for (int i = 0; i < columns.Count; i++)
     {
         state[i]              = new ColumnState();
         state[i].Visible      = columns[i].Visible;
         state[i].VisibleIndex = columns[i].VisibleIndex;
     }
     return(state);
 }
Esempio n. 3
0
 public void Load()
 {
     if (State != ColumnState.Empty)
     {
         throw new AccessViolationException("Cannot load into non-empty column!");
     }
     State = ColumnState.Loading;
     //TODO : use a bloom filter to stroe if a column is loaded
     //TODO : query if this column exists in save data and load it!
     //TODO : how many columns per page
     Generate();
 }
Esempio n. 4
0
 public void Initialize(Vector2Int offset, long columnId)
 {
     ColumnId = columnId;
     if (State != ColumnState.Uninitialized)
     {
         throw new AccessViolationException("Attempting to initialize a column in use!");
     }
     Offset     = offset;
     _height    = 0;
     _chunks    = PoolManager.GetObjectPool <List <IChunk> >().Pop();
     _neighbors = PoolManager.GetObjectPool <Dictionary <FaceDirection, Column> >().Pop();
     State      = ColumnState.Empty;
 }
    protected void gvProducts_Load(object sender, EventArgs e)
    {
        ASPxGridView gridView = sender as ASPxGridView;
        GridViewDetailRowTemplateContainer container = gridView.NamingContainer as GridViewDetailRowTemplateContainer;
        string sessionField = String.Format("{0}_ColumnsOrder", gridView.ID);

        if (Session[sessionField] != null)
        {
            ColumnState.LoadState(gridView.Columns, (ColumnState[])Session[sessionField]);
        }

        gridView.ClientInstanceName           = String.Format("{0}_{1}", gridView.ID, container.KeyValue);
        gridView.ClientSideEvents.EndCallback = String.Format("function(s, e) {{ if (s.cpIsColumnMoved) {0}.PerformCallback(); }}", container.Grid.ClientInstanceName);
    }
    protected void gvProducts_AfterPerformCallback(object sender, ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        ASPxGridView gridView     = sender as ASPxGridView;
        string       sessionField = String.Format("{0}_ColumnsOrder", gridView.ID);

        bool isColumnMoved = e.CallbackName == "COLUMNMOVE";

        if (isColumnMoved)
        {
            Session[sessionField] = ColumnState.GetState(gridView.Columns);
        }

        gridView.JSProperties["cpIsColumnMoved"] = isColumnMoved;
    }
Esempio n. 7
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 public AdvancedComPlayer()
 {
     StateMachine <StateType> .State[] states = new StateMachine <StateType> .State[]
     {
         // 操作待ち
         new StateMachine <StateType> .State()
         {
             Update = UpdateWaitControl,
         },
         // 決定
         new StateMachine <StateType> .State()
         {
             Enter  = EnterDecideColumn,
             Update = UpdateDecideColumn,
         },
         // 操作
         new StateMachine <StateType> .State()
         {
             Enter     = EnterControlTama,
             Update    = UpdateControlTamaForMain,
             NextState = () => StateType.DropTama,
         },
         // 操作
         new StateMachine <StateType> .State()
         {
             Enter     = EnterControlTama,
             Update    = UpdateControlTamaForSub,
             NextState = () => StateType.DropTama,
         },
         // 回転
         new StateMachine <StateType> .State()
         {
             Enter  = EnterRotateTama,
             Update = UpdateRotateTama,
         },
         // 落下
         new StateMachine <StateType> .State()
         {
             Update = UpdateDropTama,
         },
     };
     stateMachine = new StateMachine <StateType>(states);
     stateMachine.StartState(StateType.WaitControl);
     destColumns = new ColumnState[2];
 }
Esempio n. 8
0
        /// <summary>
        /// Initialise default values
        /// </summary>
        private void Init()
        {
            this.text         = null;
            this.width        = Column.DefaultWidth;
            this.columnState  = ColumnState.Normal;
            this.alignment    = ColumnAlignment.Left;
            this.image        = null;
            this.imageOnRight = false;
            this.columnModel  = null;
            this.x            = 0;
            this.tooltipText  = null;
            this.format       = "";
            this.sortOrder    = SortOrder.None;
            this.renderer     = null;
            this.editor       = null;
            this.comparer     = null;

            this.state = (byte)(STATE_ENABLED | STATE_EDITABLE | STATE_VISIBLE | STATE_SELECTABLE | STATE_SORTABLE);
        }
            /// <summary>
            /// Saves the state of the specified header control.
            /// </summary>
            /// <param name="header">The header control of which state will be saved.</param>
            void Save(MultiColumnCollectionHeader header)
            {
                m_SortDescriptions.Clear();
                m_OrderedColumnStates.Clear();

                foreach (var sortDesc in header.sortDescriptions)
                {
                    m_SortDescriptions.Add(sortDesc);
                }

                foreach (var column in header.columns.displayList)
                {
                    var columnState = new ColumnState()
                    {
                        index = column.index, name = column.name, actualWidth = column.desiredWidth, width = column.width.value, visible = column.visible
                    };

                    m_OrderedColumnStates.Add(columnState);
                }
            }
Esempio n. 10
0
        /// <summary>
        /// Initialise default values
        /// </summary>
        private void Init()
        {
            this.text         = null;
            this.width        = Column.DefaultWidth;
            this.columnState  = ColumnState.Normal;
            this.alignment    = ColumnAlignment.Left;
            this.image        = null;
            this.imageOnRight = false;
            this.columnModel  = null;
            this.x            = 0;
            this.tooltipText  = null;
            this.format       = "";
            this.sortOrder    = SortOrder.None;
            this.renderer     = null;
            this.editor       = null;
            this.comparer     = null;

            // Mateusz [PEYN] Adamus ([email protected])
            // Added STATE_RESIZABLE to column's initialization
            this.state = (byte)(STATE_ENABLED | STATE_EDITABLE | STATE_VISIBLE | STATE_SELECTABLE | STATE_SORTABLE | STATE_RESIZABLE);
        }
Esempio n. 11
0
        public void SetNeighbor(FaceDirection direction, Column otherColumn)
        {
            if (State == ColumnState.Uninitialized)
            {
                throw new AccessViolationException("Attempting to access an unititialized column!");
            }
            if (direction == FaceDirection.YIncreasing ||
                direction == FaceDirection.YDecreasing)
            {
                throw new ArgumentException($"{nameof(direction)} cannot be of value {direction} for columns");
            }
            var flipped = General.FlipDirection(direction);
            var old     = _neighbors.ContainsKey(direction) ? _neighbors[direction] : null;

            _neighbors[direction] = otherColumn;
            if (otherColumn == null)
            {
                return;
            }
            if (otherColumn._neighbors != null)
            {
                otherColumn._neighbors[flipped] = this;
            }
            if (State != ColumnState.Loaded && State != ColumnState.Dirty)
            {
                return;
            }
            if (old != otherColumn)
            {
                State = ColumnState.Dirty;
            }
            if (otherColumn._chunks == null)
            {
                return;
            }
            for (var y = 0; y < _chunks.Count; y++)
            {
                _chunks[y]?.SetNeighbor(direction, otherColumn[y * ChunkSize]);
            }
        }
            /// <summary>
            /// Draws the column headers.
            /// </summary>
            /// <param name="g">The System.Drawing.Graphics to draw on.</param>
            /// <param name="column">The ImageListViewColumnHeader to draw.</param>
            /// <param name="state">The current view state of column.</param>
            /// <param name="bounds">The bounding rectangle of column in client coordinates.</param>
            public override void DrawColumnHeader(Graphics g, ImageListView.ImageListViewColumnHeader column, ColumnState state, Rectangle bounds)
            {
                // Paint background
                if (mImageListView.Focused && ((state & ColumnState.Hovered) == ColumnState.Hovered))
                {
                    using (Brush bHovered = new LinearGradientBrush(bounds,
                                                                    Color.FromArgb(64, 96, 144, 240), Color.FromArgb(196, 96, 144, 240), LinearGradientMode.Vertical))
                    {
                        g.FillRectangle(bHovered, bounds);
                    }
                }
                else
                {
                    using (Brush bNormal = new LinearGradientBrush(bounds,
                                                                   Color.FromArgb(32, 128, 128, 128), Color.FromArgb(196, 128, 128, 128), LinearGradientMode.Vertical))
                    {
                        g.FillRectangle(bNormal, bounds);
                    }
                }
                using (Brush bBorder = new LinearGradientBrush(bounds,
                                                               Color.FromArgb(96, 128, 128, 128), Color.FromArgb(128, 128, 128), LinearGradientMode.Vertical))
                    using (Pen pBorder = new Pen(bBorder))
                    {
                        g.DrawLine(pBorder, bounds.Left, bounds.Top, bounds.Left, bounds.Bottom);
                        g.DrawLine(pBorder, bounds.Left, bounds.Bottom - 1, bounds.Right, bounds.Bottom - 1);
                    }
                using (Pen pen = new Pen(Color.FromArgb(16, Color.White)))
                {
                    g.DrawLine(pen, bounds.Left + 1, bounds.Top + 1, bounds.Left + 1, bounds.Bottom - 2);
                    g.DrawLine(pen, bounds.Right - 1, bounds.Top + 1, bounds.Right - 1, bounds.Bottom - 2);
                }

                // Draw the sort arrow
                int textOffset = 4;

                if (mImageListView.SortOrder != SortOrder.None && mImageListView.SortColumn == column.Type)
                {
                    Image img = null;
                    if (mImageListView.SortOrder == SortOrder.Ascending)
                    {
                        img = ImageListViewResources.SortAscending;
                    }
                    else if (mImageListView.SortOrder == SortOrder.Descending)
                    {
                        img = ImageListViewResources.SortDescending;
                    }
                    g.DrawImageUnscaled(img, bounds.X + 4, bounds.Top + (bounds.Height - img.Height) / 2);
                    textOffset += img.Width;
                }

                // Text
                bounds.X     += textOffset;
                bounds.Width -= textOffset;
                if (bounds.Width > 4)
                {
                    using (StringFormat sf = new StringFormat())
                    {
                        sf.FormatFlags   = StringFormatFlags.NoWrap;
                        sf.Alignment     = StringAlignment.Near;
                        sf.LineAlignment = StringAlignment.Center;
                        sf.Trimming      = StringTrimming.EllipsisCharacter;
                        using (Brush brush = new SolidBrush(Color.White))
                        {
                            g.DrawString(column.Text,
                                         (mImageListView.HeaderFont == null ? mImageListView.Font : mImageListView.HeaderFont),
                                         brush, bounds, sf);
                        }
                    }
                }
            }
Esempio n. 13
0
 public Visibility()
 {
     CubeID    = -1;
     FieldName = "";
     State     = ColumnState._KEEP;
 }
Esempio n. 14
0
        public void SetNewState(int columnIndex, ColumnState stateAffected, bool useAnimation)
        {
            bool[] modeEnabledNew = new bool[modeEnabled.Length];
            int    modePoweredNew = modePowered;

            modeEnabled.CopyTo(modeEnabledNew, 0);


            if (stateAffected == ColumnState.Visibility)
            { // Enable/Disable
                modeEnabledNew[columnIndex] = !modeEnabledNew[columnIndex];
                if (!modeEnabledNew[columnIndex] && modePoweredNew == columnIndex)
                {
                    modePoweredNew = -1;
                }
            }
            else if (stateAffected == ColumnState.Powered)
            { // Set/unset powered
                modePoweredNew = modePoweredNew == columnIndex ? -1 : columnIndex;

                if (!modeEnabled[columnIndex] && modePoweredNew == columnIndex)
                {
                    modeEnabledNew[columnIndex] = true;
                }
            }
            else
            {
                for (int i = 0; i < modeEnabledNew.Length; i++)
                {
                    modeEnabledNew[i] = true;
                }
                modePoweredNew = -1;
            }

            double totalDefaultSize = defaultColumnSizes.Sum();
            double columnsTotalSize = columns.Sum(c => c.Width.Value);

            // Normalize column sizes to fit totalSize.
            for (int i = 0; i < columns.Length; i++)
            {
                columns[i].MinWidth = 0;
                if (columnsTotalSize == 0 || totalDefaultSize == 0)
                {
                    columns[i].Width = new GridLength(0);
                }
                else
                {
                    columns[i].Width = new GridLength(totalDefaultSize / columnsTotalSize * columns[i].Width.Value, GridUnitType.Star);
                }
            }

            double[] columnsNewSize = new double[3];
            for (int i = 0; i < columnsNewSize.Length; i++)
            {
                columnsNewSize[i] = modeEnabledNew[i] ? (defaultColumnSizes[i] * (modePoweredNew == i ? 3f : 1f)) : 0f;
            }
            ;

            // Animate columns whose enabled or powered state changes.
            for (int i = 0; i < columnsNewSize.Length; i++)
            {
                if (modeEnabled[i] || modeEnabledNew[i])
                {
                    var    col     = columns[i];
                    double newSize = columnsNewSize[i];

                    if (useAnimation)
                    {
                        GridLengthAnimation animation = new GridLengthAnimation();
                        animation.From         = col.Width;
                        animation.To           = new GridLength(newSize, GridUnitType.Star);
                        animation.Duration     = new Duration(TimeSpan.FromMilliseconds(animationDuration));
                        animation.FillBehavior = FillBehavior.Stop; // Fixes GridSplitter not working after animation (first comment of https://stackoverflow.com/a/16844818/8577979)
                        animation.Completed   += (s, _) =>
                        {
                            col.Width = new GridLength(newSize, GridUnitType.Star);
                        };

                        if (modeEnabled[i] != modeEnabledNew[i] && defaultColumnMinSizes[i] > 0f)
                        {
                            DoubleAnimation minSizeAnimation = new DoubleAnimation(
                                modeEnabledNew[i] ? defaultColumnMinSizes[i] : 0f,
                                new Duration(TimeSpan.FromMilliseconds(animationDuration)));
                            col.BeginAnimation(ColumnDefinition.MinWidthProperty, minSizeAnimation);
                        }
                        col.BeginAnimation(ColumnDefinition.WidthProperty, animation);
                    }
                    else
                    {
                        col.MinWidth = modeEnabledNew[i] ? defaultColumnMinSizes[i] : 0f;
                        col.Width    = new GridLength(newSize, GridUnitType.Star);
                    }
                }
            }
            modeEnabled = modeEnabledNew;
            modePowered = modePoweredNew;

            //ColumnGridSplitterLeft.Visibility = (modeEnabled[0] && (modeEnabled[1] || modeEnabled[2])) ? Visibility.Visible : Visibility.Collapsed;
            //ColumnGridSplitterRight.Visibility = (modeEnabled[2] && modeEnabled[1]) ? Visibility.Visible : Visibility.Collapsed;
        }
Esempio n. 15
0
        public static SerializationState Deserialize(XmlTextReader tr)
        {
            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(tr);

            XmlNode ssNode = xmlDoc.SelectSingleNode("/SerializationState2");

            if (ssNode == null)
            {
                return(null);
            }

            SerializationState ss = new SerializationState();

            if (ssNode.Attributes["GlobalGroupState"] != null)
            {
                ss.GlobalGroupState = (GroupState)Enum.Parse(typeof(GroupState), ssNode.Attributes["GlobalGroupState"].Value);
            }

            List <ColumnState> columnStates = new List <ColumnState>();

            foreach (XmlNode csNode in ssNode.SelectNodes("ColumnStates/ColumnState"))
            {
                ColumnState cs = new ColumnState();

                if (csNode.Attributes["Name"] != null)
                {
                    cs.Name = csNode.Attributes["Name"].Value;
                }
                if (csNode.Attributes["Width"] != null)
                {
                    cs.Width = int.Parse(csNode.Attributes["Width"].Value, CultureInfo.InvariantCulture);
                }
                if (csNode.Attributes["SortOrder"] != null)
                {
                    cs.SortOrder = (SortOrder)Enum.Parse(typeof(SortOrder), csNode.Attributes["SortOrder"].Value);
                }
                if (csNode.Attributes["GroupSortOrder"] != null)
                {
                    cs.GroupSortOrder = (SortOrder)Enum.Parse(typeof(SortOrder), csNode.Attributes["GroupSortOrder"].Value);
                }
                if (csNode.Attributes["VisibleIndex"] != null)
                {
                    cs.VisibleIndex = int.Parse(csNode.Attributes["VisibleIndex"].Value, CultureInfo.InvariantCulture);
                }
                if (csNode.Attributes["GroupedIndex"] != null)
                {
                    cs.GroupedIndex = int.Parse(csNode.Attributes["GroupedIndex"].Value, CultureInfo.InvariantCulture);
                }

                columnStates.Add(cs);
            }

            ss.ColumnStates = columnStates.ToArray();

            List <GroupInstance> groupInstances = new List <GroupInstance>();

            foreach (XmlNode giNode in ssNode.SelectNodes("GroupStates/GroupState"))
            {
                GroupInstance gi = new GroupInstance();

                if (giNode.Attributes["GroupName"] != null)
                {
                    gi.GroupName = giNode.Attributes["GroupName"].Value;
                }

                List <string> path = new List <string>();

                foreach (XmlNode pathNode in giNode.SelectNodes("GroupPath/String"))
                {
                    path.Add(pathNode.Attributes["Value"].Value);
                }

                gi.GroupPath = path.ToArray();

                groupInstances.Add(gi);
            }

            ss.GroupStates = groupInstances.ToArray();

            return(ss);
        }
Esempio n. 16
0
        /// <summary>
        /// Initialise default values
        /// </summary>
        private void Init()
        {
            this.text = null;
            this.width = Column.DefaultWidth;
            this.columnState = ColumnState.Normal;
            this.alignment = ColumnAlignment.Left;
            this.image = null;
            this.imageOnRight = false;
            this.columnModel = null;
            this.x = 0;
            this.tooltipText = null;
            this.format = "";
            this.sortOrder = SortOrder.None;
            this.renderer = null;
            this.editor = null;
            this.comparer = null;

            this.state = (byte) (STATE_ENABLED | STATE_EDITABLE | STATE_VISIBLE | STATE_SELECTABLE | STATE_SORTABLE);
        }
Esempio n. 17
0
 /// <summary>
 /// Draws the column headers.
 /// </summary>
 /// <param name="g">The System.Drawing.Graphics to draw on.</param>
 /// <param name="column">The ImageListViewColumnHeader to draw.</param>
 /// <param name="state">The current view state of column.</param>
 /// <param name="bounds">The bounding rectangle of column in client coordinates.</param>
 public override void DrawColumnHeader(Graphics g, ImageListView.ImageListViewColumnHeader column, ColumnState state, Rectangle bounds)
 {
 }
            /// <summary>
            /// Draws the column headers.
            /// </summary>
            /// <param name="g">The System.Drawing.Graphics to draw on.</param>
            /// <param name="column">The ImageListViewColumnHeader to draw.</param>
            /// <param name="state">The current view state of column.</param>
            /// <param name="bounds">The bounding rectangle of column in client coordinates.</param>
            public override void DrawColumnHeader(Graphics g, ImageListView.ImageListViewColumnHeader column, ColumnState state, Rectangle bounds)
            {
                // Paint background
                if (mImageListView.Focused && ((state & ColumnState.Hovered) == ColumnState.Hovered))
                {
                    using (Brush bHovered = new LinearGradientBrush(bounds,
                        Color.FromArgb(64, 96, 144, 240), Color.FromArgb(196, 96, 144, 240), LinearGradientMode.Vertical))
                    {
                        g.FillRectangle(bHovered, bounds);
                    }
                }
                else
                {
                    using (Brush bNormal = new LinearGradientBrush(bounds,
                        Color.FromArgb(32, 128, 128, 128), Color.FromArgb(196, 128, 128, 128), LinearGradientMode.Vertical))
                    {
                        g.FillRectangle(bNormal, bounds);
                    }
                }
                using (Brush bBorder = new LinearGradientBrush(bounds,
                    Color.FromArgb(96, 128, 128, 128), Color.FromArgb(128, 128, 128), LinearGradientMode.Vertical))
                using (Pen pBorder = new Pen(bBorder))
                {
                    g.DrawLine(pBorder, bounds.Left, bounds.Top, bounds.Left, bounds.Bottom);
                    g.DrawLine(pBorder, bounds.Left, bounds.Bottom - 1, bounds.Right, bounds.Bottom - 1);
                }
                using (Pen pen = new Pen(Color.FromArgb(16, Color.White)))
                {
                    g.DrawLine(pen, bounds.Left + 1, bounds.Top + 1, bounds.Left + 1, bounds.Bottom - 2);
                    g.DrawLine(pen, bounds.Right - 1, bounds.Top + 1, bounds.Right - 1, bounds.Bottom - 2);
                }

                // Draw the sort arrow
                int textOffset = 4;
                if (mImageListView.SortOrder != SortOrder.None && mImageListView.SortColumn == column.Type)
                {
                    Image img = null;
                    if (mImageListView.SortOrder == SortOrder.Ascending)
                        img = ImageListViewResources.SortAscending;
                    else if (mImageListView.SortOrder == SortOrder.Descending)
                        img = ImageListViewResources.SortDescending;
                    g.DrawImageUnscaled(img, bounds.X + 4, bounds.Top + (bounds.Height - img.Height) / 2);
                    textOffset += img.Width;
                }

                // Text
                bounds.X += textOffset;
                bounds.Width -= textOffset;
                if (bounds.Width > 4)
                {
                    using (StringFormat sf = new StringFormat())
                    {
                        sf.FormatFlags = StringFormatFlags.NoWrap;
                        sf.Alignment = StringAlignment.Near;
                        sf.LineAlignment = StringAlignment.Center;
                        sf.Trimming = StringTrimming.EllipsisCharacter;
                        using (Brush brush = new SolidBrush(Color.White))
                        {
                            g.DrawString(column.Text,
                                (mImageListView.HeaderFont == null ? mImageListView.Font : mImageListView.HeaderFont),
                                brush, bounds, sf);
                        }
                    }
                }
            }
Esempio n. 19
0
        /// <summary>
        /// Initialise default values
        /// </summary>
        private void Init()
        {
            this.text = null;
            this.width = Column.DefaultWidth;
            this.columnState = ColumnState.Normal;
            this.alignment = ColumnAlignment.Left;
            this.image = null;
            this.imageOnRight = false;
            this.columnModel = null;
            this.x = 0;
            this.tooltipText = null;
            this.format = "";
            this.sortOrder = SortOrder.None;
            this.renderer = null;
            this.editor = null;
            this.comparer = null;

            // Mateusz [PEYN] Adamus ([email protected])
            // Added STATE_RESIZABLE to column's initialization
            this.state = (byte) (STATE_ENABLED | STATE_EDITABLE | STATE_VISIBLE | STATE_SELECTABLE | STATE_SORTABLE | STATE_RESIZABLE );
        }
Esempio n. 20
0
        public static SerializationState Deserialize(XmlTextReader tr)
        {
            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(tr);

            XmlNode ssNode = xmlDoc.SelectSingleNode("/SerializationState2");

            if (ssNode == null)
            {
                return null;
            }

            SerializationState ss = new SerializationState();

            if (ssNode.Attributes["GlobalGroupState"] != null)
            {
                ss.GlobalGroupState = (GroupState) Enum.Parse(typeof (GroupState), ssNode.Attributes["GlobalGroupState"].Value);
            }

            List<ColumnState> columnStates = new List<ColumnState>();

            foreach (XmlNode csNode in ssNode.SelectNodes("ColumnStates/ColumnState"))
            {
                ColumnState cs = new ColumnState();

                if (csNode.Attributes["Name"] != null)
                {
                    cs.Name = csNode.Attributes["Name"].Value;
                }
                if (csNode.Attributes["Width"] != null)
                {
                    cs.Width = int.Parse(csNode.Attributes["Width"].Value, CultureInfo.InvariantCulture);
                }
                if (csNode.Attributes["SortOrder"] != null)
                {
                    cs.SortOrder = (SortOrder) Enum.Parse(typeof (SortOrder), csNode.Attributes["SortOrder"].Value);
                }
                if (csNode.Attributes["GroupSortOrder"] != null)
                {
                    cs.GroupSortOrder = (SortOrder) Enum.Parse(typeof (SortOrder), csNode.Attributes["GroupSortOrder"].Value);
                }
                if (csNode.Attributes["VisibleIndex"] != null)
                {
                    cs.VisibleIndex = int.Parse(csNode.Attributes["VisibleIndex"].Value, CultureInfo.InvariantCulture);
                }
                if (csNode.Attributes["GroupedIndex"] != null)
                {
                    cs.GroupedIndex = int.Parse(csNode.Attributes["GroupedIndex"].Value, CultureInfo.InvariantCulture);
                }

                columnStates.Add(cs);
            }

            ss.ColumnStates = columnStates.ToArray();

            List<GroupInstance> groupInstances = new List<GroupInstance>();

            foreach (XmlNode giNode in ssNode.SelectNodes("GroupStates/GroupState"))
            {
                GroupInstance gi = new GroupInstance();

                if (giNode.Attributes["GroupName"] != null)
                {
                    gi.GroupName = giNode.Attributes["GroupName"].Value;
                }

                List<string> path = new List<string>();

                foreach (XmlNode pathNode in giNode.SelectNodes("GroupPath/String"))
                {
                    path.Add(pathNode.Attributes["Value"].Value);
                }

                gi.GroupPath = path.ToArray();

                groupInstances.Add(gi);
            }

            ss.GroupStates = groupInstances.ToArray();

            return ss;
        }
            /// <summary>
            /// Draws the column headers.
            /// </summary>
            /// <param name="g">The System.Drawing.Graphics to draw on.</param>
            /// <param name="column">The ImageListViewColumnHeader to draw.</param>
            /// <param name="state">The current view state of column.</param>
            /// <param name="bounds">The bounding rectangle of column in client coordinates.</param>
            public override void DrawColumnHeader(Graphics g, ImageListView.ImageListViewColumnHeader column, ColumnState state, Rectangle bounds)
            {
                SortOrder order = SortOrder.None;
                if (ImageListView.SortOrder != SortOrder.None &&
                    ((state & ColumnState.SortColumn) != ColumnState.None))
                    order = ImageListView.SortOrder;

                VisualStyleRenderer rBack;
                if (((state & ColumnState.Hovered) == ColumnState.Hovered) && order != SortOrder.None)
                    rBack = rColumnSortedHovered;
                else if (((state & ColumnState.Hovered) == ColumnState.Hovered) && order == SortOrder.None)
                    rBack = rColumnHovered;
                else if (((state & ColumnState.Hovered) == ColumnState.None) && order != SortOrder.None)
                    rBack = rColumnSorted;
                else
                    rBack = rColumnNormal;

                VisualStyleRenderer rSort;
                if (order == SortOrder.Ascending || order == SortOrder.AscendingNatural)
                    rSort = rSortAscending;
                else
                    rSort = rSortDescending;

                // Background
                if (VisualStylesEnabled && rBack != null && rSort != null)
                {
                    // Background
                    rBack.DrawBackground(g, bounds, bounds);
                    // Sort arrow
                    if (order != SortOrder.None)
                    {
                        Size sz = rSort.GetPartSize(g, System.Windows.Forms.VisualStyles.ThemeSizeType.True);
                        Rectangle sortBounds = new Rectangle(new Point(0, 0), sz);
                        sortBounds.Offset(bounds.X + (bounds.Width - sz.Width) / 2, 0);
                        rSort.DrawBackground(g, sortBounds, sortBounds);
                    }

                    // Text
                    if (bounds.Width > 4)
                    {
                        Rectangle textBounds = bounds;
                        textBounds.Inflate(-3, 0);
                        TextRenderer.DrawText(g, column.Text,
                            SystemFonts.MenuFont, textBounds, SystemColors.ControlText,
                            TextFormatFlags.EndEllipsis | TextFormatFlags.VerticalCenter | TextFormatFlags.SingleLine | TextFormatFlags.PreserveGraphicsClipping);
                    }
                }
                else
                    base.DrawColumnHeader(g, column, state, bounds);
            }
            /// <summary>
            /// Draws the column headers.
            /// </summary>
            /// <param name="g">The System.Drawing.Graphics to draw on.</param>
            /// <param name="column">The ImageListViewColumnHeader to draw.</param>
            /// <param name="state">The current view state of column.</param>
            /// <param name="bounds">The bounding rectangle of column in client coordinates.</param>
            public override void DrawColumnHeader(Graphics g, ImageListView.ImageListViewColumnHeader column, ColumnState state, Rectangle bounds)
            {
                // Paint background
                if ((state & ColumnState.Hovered) != ColumnState.None)
                {
                    using (Brush bHovered = new LinearGradientBrush(bounds, ImageListView.Colors.ColumnHeaderHoverColor1, ImageListView.Colors.ColumnHeaderHoverColor2, LinearGradientMode.Vertical))
                    {
                        g.FillRectangle(bHovered, bounds);
                    }
                }
                else
                {
                    using (Brush bNormal = new LinearGradientBrush(bounds, ImageListView.Colors.ColumnHeaderBackColor1, ImageListView.Colors.ColumnHeaderBackColor2, LinearGradientMode.Vertical))
                    {
                        g.FillRectangle(bNormal, bounds);
                    }
                }
                using (Pen pBorder = new Pen(ImageListView.Colors.ColumnSeparatorColor))
                {
                    g.DrawLine(pBorder, bounds.Left, bounds.Top, bounds.Left, bounds.Bottom);
                    g.DrawLine(pBorder, bounds.Left, bounds.Bottom - 1, bounds.Right, bounds.Bottom - 1);
                }
                using (Pen pBorder = new Pen(Color.FromArgb(252, 252, 252)))
                {
                    g.DrawRectangle(pBorder, bounds.Left + 1, bounds.Top, bounds.Width - 2, bounds.Height - 2);
                }

                // Draw the sort arrow
                int offset = 4;
                int width = bounds.Width - 2 * offset;
                if (ImageListView.SortOrder != SortOrder.None && ((state & ColumnState.SortColumn) != ColumnState.None))
                {
                    Image img = null;
                    if (ImageListView.SortOrder == SortOrder.Ascending)
                        img = ImageListViewResources.SortAscending;
                    else if (ImageListView.SortOrder == SortOrder.Descending)
                        img = ImageListViewResources.SortDescending;
                    if (img != null)
                    {
                        g.DrawImageUnscaled(img, bounds.Right - offset - img.Width, bounds.Top + (bounds.Height - img.Height) / 2);
                        width -= img.Width + offset;
                    }
                }

                // Text
                bounds.X += offset;
                bounds.Width = width;
                if (bounds.Width > 4)
                {
                    using (StringFormat sf = new StringFormat())
                    {
                        sf.FormatFlags = StringFormatFlags.NoWrap;
                        sf.Alignment = StringAlignment.Near;
                        sf.LineAlignment = StringAlignment.Center;
                        sf.Trimming = StringTrimming.EllipsisCharacter;
                        using (SolidBrush bText = new SolidBrush(ImageListView.Colors.ColumnHeaderForeColor))
                        {
                            g.DrawString(column.Text, (ImageListView.ColumnHeaderFont == null ? ImageListView.Font : ImageListView.ColumnHeaderFont), bText, bounds, sf);
                        }
                    }
                }
            }