public void SelectNodeByAttribute(StepDirection dir, AttrType attrType, SearchMessageArea area) { var activeNode = (IMsg)_tgMsgs.ActiveNode; if (activeNode == null) return; var topic = activeNode.Topic; // Ищем в текущей ветке. var treeNodes = dir == StepDirection.Down ? TreeGrid.TreeGrid.GetFlatArrayOfSubNodes(topic, activeNode) : TreeGrid.TreeGrid.GetFlatArrayOfSubNodesReverse(topic, activeNode); foreach (IMsg msg in treeNodes) if (IsMsgConformAttribute(msg, attrType)) { _tgMsgs.ActiveNode = msg; return; } // Если не нашли, то ищем темы (кроневые ветки) имеющие ответы. var isCurrPassed = false; var messages = new Msg[_tgMsgs.Nodes.Count]; _tgMsgs.Nodes.CopyTo(messages, 0); if (dir == StepDirection.Up) Array.Reverse(messages); foreach (IMsg msg in messages) { // Пропускаем все ветки пока не найдем текущую тему. if (!isCurrPassed && msg != topic) continue; if (!isCurrPassed) { isCurrPassed = true; continue; // Текущую тему тоже нужно пропустить. } // если топик сменился, а нас просили искать только в текущем топике - выходим if (area == SearchMessageArea.CurrentTopic && msg.TopicID != topic.TopicID) break; // Если в тему есть var isFound = false; switch (attrType) { case AttrType.Any: isFound = true; break; case AttrType.Marked: isFound = msg.RepliesMarked > 0 || msg.Marked; break; case AttrType.Unread: isFound = msg.RepliesUnread > 0 || msg.IsUnread; break; case AttrType.UnreadAnswerToMe: isFound = msg.RepliesToMeUnread > 0; break; } if (isFound) { switch (attrType) { case AttrType.Any: break; case AttrType.Marked: isFound = msg.IsMarked; break; case AttrType.Unread: isFound = msg.IsUnread; break; default: isFound = false; break; } if (isFound) { _tgMsgs.ActiveNode = msg; return; } treeNodes = TreeGrid.TreeGrid.GetFlatArrayOfSubNodes(msg); if (dir == StepDirection.Up) Array.Reverse(treeNodes); foreach (IMsg subMsg in treeNodes) if (IsMsgConformAttribute(subMsg, attrType)) { _tgMsgs.ActiveNode = subMsg; return; } throw new ApplicationException( "Аргрегированная информация не соответсвует реальному содержанию БД. Произведите " + "пересчет БД и обратитесь к разработчикам."); } } Beeper.DoBeep(); return; }
public void SelectNodeByAttribute(StepDirection dir, AttrType attrType, SearchMessageArea area) { var activeNode = (IMsg)_tgMsgs.ActiveNode; if (activeNode == null) { return; } var topic = activeNode.Topic; // Ищем в текущей ветке. var treeNodes = dir == StepDirection.Down ? TreeGrid.TreeGrid.GetFlatArrayOfSubNodes(topic, activeNode) : TreeGrid.TreeGrid.GetFlatArrayOfSubNodesReverse(topic, activeNode); foreach (IMsg msg in treeNodes) { if (IsMsgConformAttribute(msg, attrType)) { _tgMsgs.ActiveNode = msg; return; } } // Если не нашли, то ищем темы (кроневые ветки) имеющие ответы. var isCurrPassed = false; var messages = new Msg[_tgMsgs.Nodes.Count]; _tgMsgs.Nodes.CopyTo(messages, 0); if (dir == StepDirection.Up) { Array.Reverse(messages); } foreach (IMsg msg in messages) { // Пропускаем все ветки пока не найдем текущую тему. if (!isCurrPassed && msg != topic) { continue; } if (!isCurrPassed) { isCurrPassed = true; continue; // Текущую тему тоже нужно пропустить. } // если топик сменился, а нас просили искать только в текущем топике - выходим if (area == SearchMessageArea.CurrentTopic && msg.TopicID != topic.TopicID) { break; } // Если в тему есть var isFound = false; switch (attrType) { case AttrType.Any: isFound = true; break; case AttrType.Marked: isFound = msg.RepliesMarked > 0 || msg.Marked; break; case AttrType.Unread: isFound = msg.RepliesUnread > 0 || msg.IsUnread; break; case AttrType.UnreadAnswerToMe: isFound = msg.RepliesToMeUnread > 0; break; } if (isFound) { switch (attrType) { case AttrType.Any: break; case AttrType.Marked: isFound = msg.IsMarked; break; case AttrType.Unread: isFound = msg.IsUnread; break; default: isFound = false; break; } if (isFound) { _tgMsgs.ActiveNode = msg; return; } treeNodes = TreeGrid.TreeGrid.GetFlatArrayOfSubNodes(msg); if (dir == StepDirection.Up) { Array.Reverse(treeNodes); } foreach (IMsg subMsg in treeNodes) { if (IsMsgConformAttribute(subMsg, attrType)) { _tgMsgs.ActiveNode = subMsg; return; } } throw new ApplicationException( "Аргрегированная информация не соответсвует реальному содержанию БД. Произведите " + "пересчет БД и обратитесь к разработчикам."); } } Beeper.DoBeep(); return; }