private void ParseFiles()
        {
            foreach (var file in files)
            {
                using (var fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    using (var reader = new StreamReader(fileStream))
                    {
                        TraceInfo ti = null;
                        string    line;
                        while ((line = reader.ReadLine()) != null)
                        {
                            if (line.Trim().StartsWith("#") || string.IsNullOrEmpty(line))
                            {
                                continue;
                            }

                            if (line.StartsWith("["))
                            {
                                var lineParts = line.Split('|');

                                if (lineParts.Length == 1)
                                {
                                    ti.Description += lineParts[0];
                                    continue;
                                }

                                if (ti != null)
                                {
                                    traces.Add(ti);
                                }

                                var threadParts = lineParts[2].Split(':');
                                var list        = threadParts.ToList();
                                list.RemoveAt(0);

                                ti = new TraceInfo();

                                for (int i = 0; i < lineParts.Length; i++)
                                {
                                    if (i == 0)
                                    {
                                        var parts = lineParts[i].Split(']');
                                        ti.Date    = DateTime.Parse(parts[0].Remove(0, 1));
                                        ti.Process = parts[1].Trim().Split(':')[1].Trim();
                                        allItems.TryAdd(FilterItemType.Process, ti.Process);
                                    }
                                    else
                                    {
                                        if (ti.Process == "OUTLOOK")
                                        {
                                            var parts = lineParts[i].Split(':');
                                            switch (parts[0].Trim())
                                            {
                                            case "Thread":
                                                ti.Thread = parts[1].Trim();
                                                allItems.TryAdd(FilterItemType.Thread, ti.Thread);
                                                break;

                                            case "Category":
                                                ti.Category = parts[1].Trim();
                                                allItems.TryAdd(FilterItemType.Category, ti.Category);
                                                break;

                                            case "User":
                                                ti.User = new UserInfo {
                                                    Id = new Guid(parts[1].Trim())
                                                };
                                                allItems.TryAdd(FilterItemType.User, ti.User);
                                                break;

                                            case "Level":
                                                ti.Level = parts[1].Trim();
                                                allItems.TryAdd(FilterItemType.Level, ti.Level);
                                                break;

                                            default:
                                                ti.Description = lineParts[i].Trim() + "\r\n";
                                                break;
                                            }

                                            ti.Organization = string.Empty;
                                            ti.ReqId        = string.Empty;
                                            ti.Context      = string.Empty;
                                        }
                                        else
                                        {
                                            var parts = lineParts[i].Split(':');
                                            switch (parts[0].Trim())
                                            {
                                            case "Organization":
                                                ti.Organization = parts[1].Trim();
                                                allItems.TryAdd(FilterItemType.Organization, ti.Organization);
                                                break;

                                            case "Thread":
                                                ti.Thread = parts[1].Trim();
                                                allItems.TryAdd(FilterItemType.Thread, ti.Thread);
                                                break;

                                            case "Category":
                                                ti.Category = parts[1].Trim();
                                                allItems.TryAdd(FilterItemType.Category, ti.Category);
                                                break;

                                            case "User":
                                                ti.User = new UserInfo {
                                                    Id = new Guid(parts[1].Trim())
                                                };
                                                allItems.TryAdd(FilterItemType.User, ti.User);
                                                break;

                                            case "Level":
                                                ti.Level = parts[1].Trim();
                                                allItems.TryAdd(FilterItemType.Level, ti.Level);
                                                break;

                                            case "ReqId":
                                                ti.ReqId = parts[1].Trim();
                                                allItems.TryAdd(FilterItemType.ReqId, ti.ReqId);
                                                break;

                                            default:
                                                ti.Context = lineParts[i].Trim().Split(' ')[0];
                                                allItems.TryAdd(FilterItemType.Operation, ti.Context);
                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                            else if (line.StartsWith(">"))
                            {
                                ti.Description += line.Remove(0, 1) + "\r\n";
                            }
                            else
                            {
                                ti.Description += line + "\r\n";
                            }
                        }
                    }
            }
        }