/// <summary>
        /// Обновить контрол
        /// </summary>
        /// <param name="dataListIn">Список строк (пара строка-количество)</param>
        /// <param name="sizeChecked">Размер иконок (true = большие)</param>
        public void UpdateControl(SiegeDataBase.ResourseDictionary dataListIn, bool sizeChecked)
        {
            var iconSize = IconSize[Convert.ToInt32(sizeChecked)];
            var fontSize = FontSize[Convert.ToInt32(sizeChecked)];

            // при необходимости добавим заголовок
            var addintionalTopFromTitle = 0;
            if (!string.IsNullOrEmpty(Title))
            {
                if (_labelTitle == null)
                {
                    _labelTitle = new Label
                                  	{
                                  		Text = Title,
                                  		Location = new Point(Left, Top),
                                  		AutoSize = true
                                  	};

                    _parentControl.Controls.Add(_labelTitle);
                }
                else
                {
                    _labelTitle.Left = Left;
                    _labelTitle.Top = Top;
                }

                _labelTitle.Visible = dataListIn.Count > 0;

                if (dataListIn.Count > 0)
                    addintionalTopFromTitle = _labelTitle.Height + ConstTitlePaddingBottom;
            }

            // размножим список, если нужно
            var dataList = new SiegeDataBase.ResourseDictionary();
            foreach (var data in dataListIn)
            {
                var id = data.Key.Split(';');
                var count = data.Value;

                for (var i = 0; i < id.Length; i++)
                {
                    var code = id[i];
                    if (i > 0)
                        code = "•" + code;

                    dataList.Add(code, count);
                }
            }

            _itemsCount = dataList.Count;

            var hideenLines = 0;
            var hiddenList = new List<string>();

            // рассчитаем внешний вид контрола
            //var maxPict = Math.Max(_picturesList.Count, dataList.Count);
            //for (var i = 0; i < dataList.Count; i++)
            var k = -1;
            foreach (var data in dataList)
            {
                k++;

                var formatString = LabelFormat;

                // сохранили код
                var resCode = data.Key;

                // может ли строка быть линком
                bool linked = false;

                bool hidden = false;

                // определим или-строки
                var orCode = resCode.StartsWith("•");
                if (orCode)
                    resCode = Functions.SubString(resCode, 1);

                // рассчитаем описание строки
                string resName = null;
                if (!Functions.inList(resCode.ToLower(), "level", "rank", "castlerating"))
                    linked = SiegeDataBase.DataLanguages.Get(resCode, out resName);

                if (string.IsNullOrEmpty(resName))
                {
                    bool res;
                    var building = SiegeDataBase.DataBuildings.Get(resCode, out res);

                    if (res)
                    {
                        resName = building.Name;
                        linked = true;
                    }
                }

                // заодно определим файл иконки (ибо потом поздно будет)
                var resFile = SiegeDataBase.DataObjectsUi.Get(resCode);

                // если всё равно имени нет, значит там не код, а просто текст
                if (string.IsNullOrEmpty(resName))
                {
                    resName = SiegeDataBase.GetLocalizedStringRequirements(resCode);
                    resFile = SiegeDataBase.PictureNotAvailable;
                }

                if (hiddenList.Contains(resName))
                {
                    hidden = true;
                    hideenLines++;
                }
                else
                    hiddenList.Add(resName);

                PictureBox pict;
                LinkLabel label;
                if (_picturesList.Count <= k)
                {
                    // создаём каждую новую строчку
                    pict = new PictureBox
                           	{
                           		Size = new Size(iconSize, iconSize),
                           		Anchor = AnchorStyles.Left | AnchorStyles.Top,
                           		SizeMode = PictureBoxSizeMode.Zoom
                           	};

                    label = new LinkLabel
                                {
                                    Anchor = Width > 0
                                             	? AnchorStyles.Left | AnchorStyles.Top
                                             	: AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right,
                                    TextAlign = ContentAlignment.MiddleLeft,
                                    LinkArea = new LinkArea()
                                };

                    label.AutoSize = Width == 0;

                    if (OnClick != null)
                        label.LinkClicked += OnClick;

                    _parentControl.Controls.Add(pict);
                    _parentControl.Controls.Add(label);

                    _picturesList.Add(pict);
                    _labelsList.Add(label);
                }
                else
                {
                    pict = _picturesList[k];
                    label = _labelsList[k];

                    pict.Visible = true;
                    label.Visible = true;
                }

                if (hidden)
                {
                    pict.Visible = false;
                    label.Visible = false;
                    continue;
                }

                pict.Left = Left + 2;
                pict.Top = Top + addintionalTopFromTitle + iconSize*(k - hideenLines);
                pict.Width = iconSize;
                pict.Height = iconSize;

                label.Left = pict.Left + iconSize;
                label.Top = Top + addintionalTopFromTitle + iconSize*(k - hideenLines);
                label.Width = _parentControl.ClientSize.Width - pict.Left + Width - iconSize;
                label.Height = iconSize;
                label.Font = new Font(label.Font.FontFamily, fontSize, label.Font.Style);
                label.Tag = linked ? resCode : null;

                // рассчитаем иконку
                var img = Path.Combine(SiegeDataBase.GamePath, @"Data\Textures\");
                img = Path.Combine(img, resFile ?? SiegeDataBase.PictureError);

                pict.Image = TgaImages.GetFromFile(img);

                // расчитаем текст
                if (!linked)
                    formatString = formatString.Replace("•", "");

                // проверяем формат вывода строки
                // 0 - формат всей строки
                // 1 - формат количественных данных
                var format = formatString.Split('|');

                // цифра количества форматируется лишь в том случае, если строка является ссылкой
                // (при этом нулевое значение преобразуется в пустое)
                var formatedCount = linked && format.Length > 1
                    ? data.Value > 1 ? string.Format(format[1], data.Value) : ""
                    : data.Value.ToString();

                label.Text = string.Format(format[0],
                                           LabelToLower ? (resName ?? "").ToLower() : resName,
                                           format.Length == 1
                                            ? data.Value.ToString()
                                            : formatedCount);

                // отметим пометочкой или-строки
                if (orCode)
                {
                    label.Text = "или " + label.Text;
                    pict.Visible = false;
                }

                // расчитаем границы линка, еслиэто необходимо
                var link1 = label.Text.IndexOf("•");
                var link2 = label.Text.LastIndexOf("•");
                label.LinkArea = LinkedText && linked && link1 >= 0
                                 	? new LinkArea(link1, link2 - 2)
                                 	: new LinkArea();

                // удаляем метки линка
                if (link1 >= 0)
                    label.Text = label.Text.Replace("•", "");
            }

            // убираем лишние строки
            for (var i = dataList.Count; i < _picturesList.Count; i++)
            {
                _picturesList[i].Visible = false;
                _labelsList[i].Visible = false;
            }

            // сместим дочерний контрол, при необходимости
            if (LinkedControl != null)
            {
                LinkedControl.Top = Top + addintionalTopFromTitle + iconSize*(_itemsCount - hideenLines) + ConstLinkedControlPadding;
            }
        }
        /*
        /// <summary>
        /// Обновить контрол
        /// </summary>
        /// <param name="dataList">Список строк (пара строка-количество)</param>
        /// <param name="sizeChecked">Размер иконок (true = большие)</param>
        public void UpdateControl(IList<SiegeBuildingStructure.ResoursePair> dataList, bool sizeChecked)
        {
            UpdateControl(dataList, sizeChecked, Top);
        }
        */
        /// <summary>
        /// Обновить контрол
        /// </summary>
        /// <param name="strList">Список строк (пара строка-количество)</param>
        /// <param name="sizeChecked">Размер иконок (true = большие)</param>
        public void UpdateControl(IList<string> strList, bool sizeChecked)
        {
            var list = new SiegeDataBase.ResourseDictionary();

            foreach (var str in strList)
            {
                var pos = str.IndexOf(',');

                var id = pos > 0 ? Functions.SubString(str, 0, pos).Trim() : str;

                var count = 1;
                if (pos > 0)
                    Int32.TryParse(Functions.SubString(str, pos + 1).Trim(), out count);

                list.Add(id, count);
            }

            UpdateControl(list, sizeChecked);
        }