示例#1
0
        /// <summary>
        /// Добавить контрол.
        /// </summary>
        /// <param name="control">Контрол.</param>
        public void AddControl(IActiveControl control)
        {
            // Если контрол не задан, выходим.
            if (control == null)
            {
                return;
            }

            // Если контрол ещё не добавлен, добавляем.
            if (!_assignedControls.Contains(control))
            {
                _assignedControls.Add(control);
            }
        }
示例#2
0
        /// <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);
        }
示例#3
0
 /// <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));
 }