/// <summary> /// Добавить контрол. /// </summary> /// <param name="control">Контрол.</param> public void AddControl(IActiveControl control) { // Если контрол не задан, выходим. if (control == null) { return; } // Если контрол ещё не добавлен, добавляем. if (!_assignedControls.Contains(control)) { _assignedControls.Add(control); } }
/// <summary> /// Возвращает экземпляр команды. /// </summary> /// <param name="command">Тип команды.</param> /// <param name="control">Контрол.</param> /// <returns>Экземпляр команды.</returns> public static Command GetInstance(string command, IActiveControl control) { // Если команда есть в кэше третьего уровня, возвращаем её. if (Commands3.ContainsKey(command)) { // Добаляем контрол в команду. Commands3[command].Value.AddControl(control); // Возвращаем команду. return(Commands3[command].Value); } // Если команда есть в кэше второго уровня... if (Commands2.ContainsKey(command)) { // Текущее количество обращений к команде. int i = Commands2[command].Key + 1; // Команда. Command cmd = Commands2[command].Value; // Добаляем контрол в команду. cmd.AddControl(control); // Если количество обращений к команде больше порогового значения... if (i >= IntercacheCounter) { // Переводим команду в кэш третьего уровня. Commands3.Add(command, new KeyValuePair <int, Command>(0, cmd)); Commands2.Remove(command); } else { // Инкрементируем счётчик обращений к команде. Commands2[command] = new KeyValuePair <int, Command>(i, cmd); } // Возвращаем команду. return(cmd); } // Если команда есть в кэше первого уровня... if (Commands1.ContainsKey(command)) { // Текущее количество обращений к команде. int i = Commands1[command].Key + 1; // Команда. Command cmd = Commands1[command].Value; // Добаляем контрол в команду. cmd.AddControl(control); // Если количество обращений к команде больше порогового значения... if (i >= IntercacheCounter) { // Переводим команду в кэш второго уровня. Commands2.Add(command, new KeyValuePair <int, Command>(0, cmd)); Commands1.Remove(command); } else { // Инкрементируем счётчик обращений к команде. Commands1[command] = new KeyValuePair <int, Command>(i, cmd); } // Возвращаем команду. return(cmd); } // Если команда не найдена ни в одном из кэшей... // Имя типа команды. string cmdTypeName = @"Makarov.FlowchartBuilder.Commands." + command; // Определяем тип команды. Type cmdType = Type.GetType(cmdTypeName); // Если нет такого типа, бросаем исключение. if (cmdType == null) { throw new CommandNotExistsException(cmdTypeName); } // Создаём экземпляр данного типа. var newCommand = (Command)Activator.CreateInstance(cmdType); // Добавляем команду в кэш первого уровня. Commands1.Add(command, new KeyValuePair <int, Command>(0, newCommand)); // Добаляем контрол в команду. newCommand.AddControl(control); // Возвращаем команду. return(newCommand); }
/// <summary> /// Возвращает экземпляр команды. /// </summary> /// <typeparam name="T">Тип команды.</typeparam> /// <param name="control">Контрол.</param> /// <returns>Экземпляр команды.</returns> public static Command GetInstance <T>(IActiveControl control) { string[] commandName = typeof(T).Name.Split('.'); return(GetInstance(commandName[commandName.Length - 1], control)); }