コード例 #1
0
ファイル: ForumDummyForm.cs プロジェクト: permyakov/janus
		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;
		}
コード例 #2
0
        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;
        }