/// <summary>
 /// Проверяет, можно ли добавить группу дисплеев на область мониторинга (разрешить drag-n-drop)
 /// </summary>
 /// <param name="node">Нода группы дисплеев</param>
 /// <returns>true, если можно</returns>
 public bool canAddGroup(DisplayGroupNode node)
 {
     foreach(String name in node.DisplayGroup.DisplayNameList)
         if(!m_Viewers.ContainsKey(name))
             return true;
     return false;
 }
 public List<Interfaces.IDisplayViewer> addGroup(DisplayGroupNode node)
 {
     List<Interfaces.IDisplayViewer> retValue = new List<IDisplayViewer>();
     List<Display> displays = DisplayController.Instance.ForceCheckGroup(node);
     foreach (Display disp in displays)
     {
         if (!m_Viewers.ContainsKey(disp.Type.Name))
         {
             DisplayViewer viewer = new DisplayViewer(disp) { Pos = getPosition(disp) };
             m_Viewers.Add(disp.Type.Name, viewer);
             retValue.Add(viewer);
         }
     }
     PresentationController.Instance.NotifyMonitorListChanged(from pair in m_Viewers select pair.Value.Display);
     return retValue;
 }
 void Instance_OnDisplayGroupCreated(DisplayGroup newGroup)
 {
     TreeNodeAdv node = new DisplayGroupNode(newGroup);
     displayTree.Nodes.Add(node);
     displayTree.BeginEdit(node);
 }
 /// <summary>
 /// Обработчик включения галочки для группы извне. Оповещает свой контол. Возвращает список дисплеев в группе
 /// </summary>
 /// <param name="node">Нода группы</param>
 /// <returns>Список дисплеев в группе</returns>
 public List<Display> ForceCheckGroup(DisplayGroupNode node)
 {
     List<Display> displays = this.DisplayByGroup(node.DisplayGroup);
     if (OnDisplayForceChecked != null)
         foreach (Display disp in displays)
             OnDisplayForceChecked(disp, true);
     return displays;
 }
        private void LoadDisplays(bool rememberLastDisplay)
        {
            displayTree.Nodes.Clear();
            DisplayNode d1 = null;
            DisplayGroupNode d2 = null;

            TreeNodeAdv tNode = displayTree.SelectedNode;
            // Выбираем дисплеи в том порядке, в котором их отсортировал пользователь
            var query = from d in DisplayController.Instance.UngrouppedDisplays()
                        join ord in PresentationController.Instance.Presentation.DisplayPositionList
                        on d.Name equals ord.Key
                        into d_ord
                        from sub in d_ord.DefaultIfEmpty()
                        orderby (sub.Key == null ? -1 : sub.Value)
                        select d;

            foreach (Display disp in query/*DisplayController.Instance.UngrouppedDisplays()*/)
            {
                DisplayNode node = new DisplayNode(disp);
                //if (DisplayController.IsPlayerMode)
                bool? state = DisplayController.Instance.DisplayStates[disp];
                node.TextColor = state.HasValue ? (state.Value ? Color.Green : Color.Red) : Color.Black;
                //node.TextColor = DisplayController.Instance.DisplayStates[disp] ? Color.Black : Color.Red;
                if (d1 == null)
                {
                    d1 = node;
                    displayTree.Nodes.Add(d1);
                }
                else
                    displayTree.Nodes.Add(node);
            }

            foreach (var dd in DisplayController.Instance.GrouppedDisplays())
            {
                DisplayGroupNode groupNode = new DisplayGroupNode(dd.Key);

                if (d2 == null)
                    d2 = groupNode;

                foreach (Display display in dd.Value)
                {
                    DisplayNode node = new DisplayNode(display);
                    //if (DisplayController.IsPlayerMode)
                    bool? state = DisplayController.Instance.DisplayStates[display];
                    node.TextColor = state.HasValue ? (state.Value ? Color.Green : Color.Red) : Color.Black;

                        //node.TextColor = DisplayController.Instance.DisplayStates[display] ? Color.Black : Color.Red;
                    groupNode.Nodes.Add(node);
                }

                displayTree.Nodes.Add(groupNode);
            }

            if (d1 != null && !rememberLastDisplay)
            {
                DisplayController.Instance.SelectDisplay(d1.Display);
                this.displayTree.SelectedNode = d1;
                return;
            }

            if (d2 != null && !rememberLastDisplay)
            {
                DisplayController.Instance.SelectDisplayGroup(d2.DisplayGroup);
                this.displayTree.SelectedNode = d2;
            }

            if (rememberLastDisplay && tNode != null)
            {
                if (displayTree.Nodes.Contains(tNode))
                    displayTree.SelectedNode = tNode;
            }

            this.displayTree.SelectedNodeForeColor = this.displayTree.SelectedNode.TextColor;
            this.displayTree.InactiveSelectedNodeForeColor = this.displayTree.SelectedNode.TextColor;
        }