Exemplo n.º 1
0
 public CommandLineHandler(
     Preprocessing.IManager preprocessingManager,
     IStepsFactory preprocessingStepsFactory)
 {
     this.preprocessingManager      = preprocessingManager;
     this.preprocessingStepsFactory = preprocessingStepsFactory;
 }
Exemplo n.º 2
0
 public DragDropHandler(
     Preprocessing.IManager preprocessingManager,
     Preprocessing.IStepsFactory preprocessingStepsFactory,
     ILogSourcesManager logSourcesManager)
 {
     this.preprocessingManager      = preprocessingManager;
     this.preprocessingStepsFactory = preprocessingStepsFactory;
     this.logSourcesManager         = logSourcesManager;
 }
Exemplo n.º 3
0
        public Presenter(
            ILogSourcesManager logSourcesManager,
            IChangeNotification changeNotification,
            IView view,
            Preprocessing.IManager sourcesPreprocessingManager,
            Preprocessing.IStepsFactory preprocessingStepsFactory,
            MRU.IRecentlyUsedEntities mru,
            QuickSearchTextBox.IPresenter searchBoxPresenter,
            IAlertPopup alerts,
            ITraceSourceFactory traceSourceFactory
            )
        {
            this.view = view;
            this.changeNotification          = changeNotification;
            this.logSourcesManager           = logSourcesManager;
            this.sourcesPreprocessingManager = sourcesPreprocessingManager;
            this.preprocessingStepsFactory   = preprocessingStepsFactory;
            this.mru = mru;
            this.searchBoxPresenter = searchBoxPresenter;
            this.trace  = traceSourceFactory.CreateTraceSource("UI", "hist-dlg");
            this.alerts = alerts;

            items            = Selectors.Create(() => visible, () => acceptedFilter, MakeItems);
            actuallySelected = Selectors.Create(() => items().displayItems, () => selected,
                                                (items, selected) => items.SelectMany(i => i.Flatten()).Where(i => selected.Contains(i.key)).ToImmutableList());
            openButtonEnabled = Selectors.Create(actuallySelected, selected => selected.Any(IsOpenable));
            rootViewItem      = Selectors.Create(() => items().displayItems, () => selected, () => expanded, MakeRootItem);

            searchBoxPresenter.OnSearchNow += (s, e) =>
            {
                acceptedFilter = searchBoxPresenter.Text;
                FocusItemsListAndSelectFirstItem();
                changeNotification.Post();
            };
            searchBoxPresenter.OnRealtimeSearch += (s, e) =>
            {
                acceptedFilter = searchBoxPresenter.Text;
                changeNotification.Post();
            };
            searchBoxPresenter.OnCancelled += (s, e) =>
            {
                if (acceptedFilter != "")
                {
                    acceptedFilter = "";
                    searchBoxPresenter.Focus(null);
                }
                else
                {
                    visible = false;
                }
                changeNotification.Post();
            };

            view.SetViewModel(this);
        }
        public Presenter(
            ILogSourcesManager sourcesManager,
            Preprocessing.IManager preprocessingManager,
            ISynchronizationContext sync,
            IHeartBeatTimer heartbeat,
            IPresentersFacade presentersFacade,
            StatusReports.IPresenter statusReports
            )
        {
            this.preprocessingManager = preprocessingManager;
            this.presentersFacade     = presentersFacade;
            this.statusReports        = statusReports;

            this.updateInvokeHelper = new AsyncInvokeHelper(sync, Update);

            sourcesManager.OnLogSourceStatsChanged += (sender, e) =>
            {
                bool?logSourceNeedsFixing = null;
                if ((e.Flags & LogProviderStatsFlag.FirstMessageWithTimeConstraintViolation) != 0 ||
                    (e.Flags & LogProviderStatsFlag.Error) != 0)
                {
                    var badMsg = ((ILogSource)sender).Provider.Stats.FirstMessageWithTimeConstraintViolation;
                    var failedWithBoundaryDates = ((ILogSource)sender).Provider.Stats.Error is BadBoundaryDatesException;

                    logSourceNeedsFixing = badMsg != null || failedWithBoundaryDates;
                }
                if (logSourceNeedsFixing != null)
                {
                    bool updated;
                    if (logSourceNeedsFixing.Value)
                    {
                        updated = logSourcesRequiringReordering.Add((ILogSource)sender);
                    }
                    else
                    {
                        updated = logSourcesRequiringReordering.Remove((ILogSource)sender);
                    }
                    if (updated)
                    {
                        updateFlag.Invalidate();
                    }
                }
            };
            sourcesManager.OnLogSourceRemoved += (sender, e) =>
            {
                updateFlag.Invalidate();
            };
            heartbeat.OnTimer += (sender, e) =>
            {
                if (e.IsNormalUpdate && updateFlag.Validate())
                {
                    Update();
                }
            };
        }
 static void UpdateCopyPathButton(ViewState viewState,
                                  ILogProvider sourceProvider, Preprocessing.IManager preprocessings)
 {
     viewState.copyablePath   = preprocessings.ExtractCopyablePathFromConnectionParams(sourceProvider.ConnectionParams);
     viewState.CopyPathButton = new ControlState
     {
         Disabled = viewState.copyablePath == null,
         Text     = "Copy path",
         Tooltip  = "copy log source path"
     };
 }
Exemplo n.º 6
0
 public Presenter(
     IView view,
     Preprocessing.IManager preprocessingManager,
     Preprocessing.IStepsFactory preprocessingStepsFactory,
     ITShark tShark
     )
 {
     this.view = view;
     this.preprocessingManager      = preprocessingManager;
     this.preprocessingStepsFactory = preprocessingStepsFactory;
     this.tShark = tShark;
 }
        static ViewState MakeViewState(
            string annotation,
            string timeOffset,
            bool sourceVisible,
            bool sourceTrackingEnabled,
            int sourceColorIndex,
            string sourceDisplayName,
            ILogProvider sourceProvider,
            Preprocessing.IManager preprocessings,
            ImmutableArray <Color> themeThreadColors,
            IReadOnlyList <IThread> sourceThreads
            )
        {
            ViewState state = new ViewState();

            state.NameEditbox = new ControlState
            {
                Text = sourceDisplayName
            };
            state.FormatTextBox = new ControlState
            {
                Text = LogProviderFactoryRegistry.ToString(sourceProvider.Factory)
            };
            state.VisibleCheckBox = new ControlState
            {
                Checked = sourceVisible
            };

            state.ColorPanel = new ControlState
            {
                BackColor = themeThreadColors.GetByIndex(sourceColorIndex)
            };

            state.AnnotationTextBox = new ControlState
            {
                Text = annotation
            };

            state.TimeOffsetTextBox = new ControlState
            {
                Text = timeOffset
            };

            UpdateStatsView(state, sourceProvider);
            UpdateSuspendResumeTrackingLink(state, sourceVisible, sourceTrackingEnabled);
            UpdateFirstAndLastMessages(state, sourceThreads, sourceVisible);
            UpdateSaveAs(state, sourceProvider);
            UpdateCopyPathButton(state, sourceProvider, preprocessings);
            UpdateOpenContainingFolderButton(state, sourceProvider, preprocessings);

            return(state);
        }
Exemplo n.º 8
0
        public Presenter(
            ILogSourcesManager logSourcesManager,
            Workspaces.IWorkspacesManager workspacesManager,
            Preprocessing.IManager preprocessingsManager,
            IAlertPopup alertPopup,
            IClipboardAccess clipboard,
            IView view,
            IChangeNotification changeNotification
            )
        {
            this.logSourcesManager = logSourcesManager;
            this.workspacesManager = workspacesManager;
            this.view = view;
            this.preprocessingsManager = preprocessingsManager;
            this.alertPopup            = alertPopup;
            this.clipboard             = clipboard;
            this.changeNotification    = changeNotification;

            view.SetEventsHandler(this);

            logSourcesManager.OnLogSourceAdded += (sender, args) =>
            {
                UpdateAvaialibility();
            };

            logSourcesManager.OnLogSourceRemoved += (sender, args) =>
            {
                UpdateAvaialibility();
            };

            workspacesManager.CurrentWorkspaceChanged += (sender, args) =>
            {
                UpdateWorkspaceUrlEditBox();
                UpdateWorkspaceEditCotrols();
            };

            workspacesManager.StatusChanged += (sender, args) =>
            {
                UpdateWorkspaceUrlEditBox();
                UpdateDescription();
                UpdateDialogButtons();
                UpdateProgressIndicator();
                UpdateWorkspaceEditCotrols(triggeredByStatusChange: true);
                UpdateIsBusy();
            };

            UpdateAvaialibility();
            UpdateDescription();
            UpdateWorkspaceUrlEditBox();
            UpdateDialogButtons();
            UpdateWorkspaceEditCotrols();
        }
Exemplo n.º 9
0
 static void UpdateOpenContainingFolderButton(ViewState viewState,
                                              ILogProvider sourceProvider, Preprocessing.IManager preprocessings)
 {
     viewState.containingFolderPath = preprocessings.ExtractUserBrowsableFileLocationFromConnectionParams(
         sourceProvider.ConnectionParams);
     viewState.OpenContainingFolderButton = new ControlState
     {
         Disabled = viewState.containingFolderPath == null,
         Text     =
             RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ?
             "Reveal in Finder" :
             "Open Containing Folder"
     };
 }
        static void UpdateOpenContainingFolderButton(ViewState viewState,
                                                     ILogProvider sourceProvider, Preprocessing.IManager preprocessings)
        {
            viewState.containingFolderPath = preprocessings.ExtractUserBrowsableFileLocationFromConnectionParams(
                sourceProvider.ConnectionParams);
            viewState.OpenContainingFolderButton = new ControlState
            {
                Disabled = viewState.containingFolderPath == null,
                Text     =
#if MONOMAC
                    "Reveal in Finder"
#else
                    "Open Containing Folder"
#endif
            };
        }
        public Presenter(
            IView view,
            ILogSourcesManager logSources,
            Preprocessing.IManager preprocessings,
            IModelThreads threads,
            IPresentersFacade navHandler,
            IAlertPopup alerts,
            IClipboardAccess clipboard,
            IShellOpen shellOpen,
            IColorTheme theme,
            IHeartBeatTimer heartBeat,
            IChangeNotification changeNotification
            )
        {
            this.view               = view;
            this.presentersFacade   = navHandler;
            this.alerts             = alerts;
            this.preprocessings     = preprocessings;
            this.clipboard          = clipboard;
            this.shellOpen          = shellOpen;
            this.theme              = theme;
            this.changeNotification = changeNotification.CreateChainedChangeNotification(initiallyActive: false);

            logSources.OnLogSourceStatsChanged += (s, e) =>
            {
                if (s == logSources)
                {
                    pendingUpdateFlag.Invalidate();
                }
            };

            threads.OnThreadListChanged       += (s, e) => pendingUpdateFlag.Invalidate();
            threads.OnThreadPropertiesChanged += (s, e) => pendingUpdateFlag.Invalidate();

            heartBeat.OnTimer += (s, e) =>
            {
                if (pendingUpdateFlag.Validate())
                {
                    ++forceUpdateRevision;
                    changeNotification.Post();
                }
            };

            this.getViewState = () => emptyViewState;

            view.SetViewModel(this);
        }
Exemplo n.º 12
0
        public Presenter(
            ILogSourcesManager logSourcesManager,
            IView view,
            Preprocessing.IManager sourcesPreprocessingManager,
            Preprocessing.IStepsFactory preprocessingStepsFactory,
            MRU.IRecentlyUsedEntities mru,
            QuickSearchTextBox.IPresenter searchBoxPresenter,
            IAlertPopup alerts,
            ITraceSourceFactory traceSourceFactory
            )
        {
            this.view = view;
            this.logSourcesManager           = logSourcesManager;
            this.sourcesPreprocessingManager = sourcesPreprocessingManager;
            this.preprocessingStepsFactory   = preprocessingStepsFactory;
            this.mru = mru;
            this.searchBoxPresenter = searchBoxPresenter;
            this.trace  = traceSourceFactory.CreateTraceSource("UI", "hist-dlg");
            this.alerts = alerts;

            searchBoxPresenter.OnSearchNow += (s, e) =>
            {
                UpdateItems();
                FocusItemsListAndSelectFirstItem();
            };
            searchBoxPresenter.OnRealtimeSearch += (s, e) => UpdateItems();
            searchBoxPresenter.OnCancelled      += (s, e) =>
            {
                if (itemsFiltered)
                {
                    UpdateItems();
                    searchBoxPresenter.Focus(null);
                }
                else
                {
                    view.Hide();
                }
            };

            view.SetEventsHandler(this);
        }
        public static SI.MenuData.Item CreateStateInspectorMenuItem(
            SI.IVisualizerNode selectedNode,
            LogJoint.UI.Presenters.IPromptDialog prompt,
            Preprocessing.IManager preprocessingManager,
            SpringServiceLog.IPreprocessingStepsFactory preprocessingStepsFactory
            )
        {
            if (preprocessingStepsFactory == null)
            {
                return(null);
            }

            SI.IVisualizerNode GetParent(SI.IVisualizerNode n) => n.Parent == null ? n : GetParent(n.Parent);

            var(id, referenceTime, env) = Rtc.MeetingsStateInspector.GetMeetingRelatedId(
                selectedNode.CreationEvent, selectedNode.ChangeHistory,
                GetParent(selectedNode).CreationEvent, GetParent(selectedNode).ChangeHistory
                );
            if (id == null)
            {
                return(null);
            }

            return(new SI.MenuData.Item(
                       "Download backend logs",
                       () =>
            {
                var input = prompt.ExecuteDialog(
                    "Download RTC backend logs",
                    "Specify query parameters",
                    $"ID={id}{Environment.NewLine}Environment={env ?? "(undetected)"}{Environment.NewLine}Reference time={referenceTime.ToString("o")}");
                if (input != null)
                {
                    var ids = new[] { id };
                    foreach (var line in input.Split('\r', '\n'))
                    {
                        var m = Regex.Match(line, @"^(?<k>[^\=]+)\=(?<v>.+)$", RegexOptions.ExplicitCapture);
                        if (!m.Success)
                        {
                            continue;
                        }
                        var k = m.Groups["k"].Value;
                        var v = m.Groups["v"].Value;
                        if (k == "ID")
                        {
                            ids = v.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                        }
                        else if (k == "Environment")
                        {
                            env = v;
                        }
                        else if (k == "Reference time")
                        {
                            if (DateTime.TryParseExact(v, "o", null, System.Globalization.DateTimeStyles.None, out var tmpRefTime))
                            {
                                referenceTime = tmpRefTime;
                            }
                        }
                    }
                    preprocessingManager.Preprocess(
                        new[] { preprocessingStepsFactory.CreateDownloadBackendLogsStep(ids, referenceTime, env) },
                        "Downloading backend logs",
                        Preprocessing.PreprocessingOptions.HighlightNewPreprocessing
                        );
                }
            }
                       ));
        }
Exemplo n.º 14
0
        public Presenter(
            ILogSourcesManager logSources,
            IView view,
            IManager logSourcesPreprocessings,
            SourcePropertiesWindow.IPresenter propertiesWindowPresenter,
            LogViewer.IPresenterInternal logViewerPresenter,
            IAlertPopup alerts,
            IFileDialogs fileDialogs,
            IClipboardAccess clipboard,
            IShellOpen shellOpen,
            SaveJointLogInteractionPresenter.IPresenter saveJointLogInteractionPresenter,
            IColorTheme theme,
            IChangeNotification changeNotification,
            IHeartBeatTimer heartbeat
            )
        {
            this.logSources = logSources;
            this.view       = view;
            this.propertiesWindowPresenter = propertiesWindowPresenter;
            this.logSourcesPreprocessings  = logSourcesPreprocessings;
            this.alerts      = alerts;
            this.fileDialogs = fileDialogs;
            this.clipboard   = clipboard;
            this.shellOpen   = shellOpen;
            this.saveJointLogInteractionPresenter = saveJointLogInteractionPresenter;
            this.changeNotification = changeNotification;

            void updateItems()
            {
                itemsRevision++;
                changeNotification.Post();
            }

            logSources.OnLogSourceVisiblityChanged  += (s, e) => updateItems();
            logSources.OnLogSourceAnnotationChanged += (s, e) => updateItems();
            logSources.OnLogSourceColorChanged      += (s, e) => updateItems();

            logSourcesPreprocessings.PreprocessingChangedAsync += (s, e) => pendingUpdateFlag.Invalidate();
            logSources.OnLogSourceStatsChanged += (s, e) =>
            {
                if ((e.Flags & (LogProviderStatsFlag.Error | LogProviderStatsFlag.CachedMessagesCount | LogProviderStatsFlag.State | LogProviderStatsFlag.BytesCount | LogProviderStatsFlag.BackgroundAcivityStatus)) != 0)
                {
                    pendingUpdateFlag.Invalidate();
                }
            };

            heartbeat.OnTimer += (s, e) =>
            {
                if (pendingUpdateFlag.Validate())
                {
                    updateItems();
                }
            };

            this.getRoot = Selectors.Create(
                () => logSources.Items,
                () => logSourcesPreprocessings.Items,
                () => theme.ThreadColors,
                () => expandedKeys,
                () => selectedKeys,
                () => itemsRevision,
                (sources, preprocessings, themeColors, expanded, selected, rev) => new RootViewItem
            {
                Items = ImmutableArray.CreateRange(
                    EnumItemsData(sources, preprocessings, themeColors, expanded, selected, logSourcesPreprocessings))
            }
                );

            this.getSelectedSources = Selectors.Create(
                getRoot,
                root => ImmutableArray.CreateRange(
                    ViewItem.Flatten(root).Where(i => i.IsSelected).SelectMany(i =>
            {
                if (i is LogSourceViewItem singleSource)
                {
                    return new[] { singleSource.LogSource }
                }
                ;
                if (i is SourcesContainerViewItem container)
                {
                    return(container.LogSources.Select(x => x.LogSource));
                }
                return(Enumerable.Empty <ILogSource>());
            })
                    .Distinct()
                    )
                );

            this.getSelectedPreprocessings = Selectors.Create(
                getRoot,
                root => ImmutableArray.CreateRange(
                    ViewItem.Flatten(root).OfType <PreprocessingViewItem>().Select(p => p.Preprocessing)
                    )
                );

            this.getFocusedMessageItem = Selectors.Create(
                () => logViewerPresenter.FocusedMessage,
                getRoot,
                (msg, root) =>
            {
                var ls = msg?.GetLogSource();
                return((IViewItem)ViewItem.Flatten(root).FirstOrDefault(
                           i => (i as LogSourceViewItem)?.LogSource == ls
                           ));
            }
                );

            view.SetViewModel(this);
        }
Exemplo n.º 15
0
        public Presenter(
            ILogSourcesManager logSources,
            Preprocessing.IManager preprocessingsManager,
            IView view,
            LogViewer.IPresenterInternal viewerPresenter,
            SearchResult.IPresenter searchResultPresenter,
            SearchPanel.IPresenter searchPanelPresenter,
            SourcesManager.IPresenter sourcesManagerPresenter,
            MessagePropertiesDialog.IPresenter messagePropertiesDialogPresenter,
            LoadedMessages.IPresenter loadedMessagesPresenter,
            BookmarksManager.IPresenter bookmarksManagerPresenter,
            IHeartBeatTimer heartBeatTimer,
            ITabUsageTracker tabUsageTracker,
            StatusReports.IPresenter statusReportFactory,
            IDragDropHandler dragDropHandler,
            IPresentersFacade presentersFacade,
            IAutoUpdater autoUpdater,
            Progress.IProgressAggregator progressAggregator,
            IAlertPopup alerts,
            SharingDialog.IPresenter sharingDialogPresenter,
            IssueReportDialogPresenter.IPresenter issueReportDialogPresenter,
            IShutdownSource shutdown,
            IColorTheme theme,
            IChangeNotification changeNotification,
            ITraceSourceFactory traceSourceFactory
            )
        {
            this.tracer                = traceSourceFactory.CreateTraceSource("UI", "ui.main");
            this.logSources            = logSources;
            this.preprocessingsManager = preprocessingsManager;
            this.view                       = view;
            this.tabUsageTracker            = tabUsageTracker;
            this.searchPanelPresenter       = searchPanelPresenter;
            this.searchResultPresenter      = searchResultPresenter;
            this.bookmarksManagerPresenter  = bookmarksManagerPresenter;
            this.viewerPresenter            = viewerPresenter;
            this.presentersFacade           = presentersFacade;
            this.dragDropHandler            = dragDropHandler;
            this.heartBeatTimer             = heartBeatTimer;
            this.autoUpdater                = autoUpdater;
            this.progressAggregator         = progressAggregator;
            this.alerts                     = alerts;
            this.sharingDialogPresenter     = sharingDialogPresenter;
            this.issueReportDialogPresenter = issueReportDialogPresenter;
            this.shutdown                   = shutdown;
            this.statusRepors               = statusReportFactory;
            this.theme                      = theme;
            this.changeNotification         = changeNotification;

            view.SetViewModel(this);

            viewerPresenter.ManualRefresh += delegate(object sender, EventArgs args)
            {
                using (tracer.NewFrame)
                {
                    tracer.Info("----> User Command: Refresh");
                    logSources.Refresh();
                }
            };
            viewerPresenter.FocusedMessageBookmarkChanged += delegate(object sender, EventArgs args)
            {
                if (searchResultPresenter != null)
                {
                    searchResultPresenter.MasterFocusedMessage = viewerPresenter.FocusedMessageBookmark;
                }
            };
            if (messagePropertiesDialogPresenter != null)
            {
                viewerPresenter.DefaultFocusedMessageActionCaption = "Show properties...";
                viewerPresenter.DefaultFocusedMessageAction       += (s, e) =>
                {
                    messagePropertiesDialogPresenter.Show();
                };
            }

            if (searchResultPresenter != null)
            {
                searchResultPresenter.OnClose           += (sender, args) => searchPanelPresenter.CollapseSearchResultPanel();
                searchResultPresenter.OnResizingStarted += (sender, args) => view.BeginSplittingSearchResults();
            }

            sourcesManagerPresenter.OnBusyState += (_, evt) => SetWaitState(evt.BusyStateRequired);

            searchPanelPresenter.InputFocusAbandoned += delegate(object sender, EventArgs args)
            {
                loadedMessagesPresenter.LogViewerPresenter.ReceiveInputFocus();
            };
            loadedMessagesPresenter.OnResizingStarted += (s, e) => view.BeginSplittingTabsPanel();

            this.heartBeatTimer.OnTimer += (sender, e) =>
            {
                if (e.IsRareUpdate)
                {
                    SetAnalyzingIndication(logSources.Items.Any(s => s.TimeGaps.IsWorking));
                }
            };

            logSources.OnLogSourceAdded += (sender, evt) =>
            {
                UpdateFormCaption();
            };
            logSources.OnLogSourceRemoved += (sender, evt) =>
            {
                UpdateFormCaption();
            };

            progressAggregator.ProgressStarted += (sender, args) =>
            {
                view.SetTaskbarState(TaskbarState.Progress);
                UpdateFormCaption();
            };

            progressAggregator.ProgressEnded += (sender, args) =>
            {
                view.SetTaskbarState(TaskbarState.Idle);
                UpdateFormCaption();
            };

            progressAggregator.ProgressChanged += (sender, args) =>
            {
                view.UpdateTaskbarProgress(args.ProgressPercentage);
                UpdateFormCaption();
            };

            if (sharingDialogPresenter != null)
            {
                sharingDialogPresenter.AvailabilityChanged += (sender, args) =>
                {
                    UpdateShareButton();
                };
                sharingDialogPresenter.IsBusyChanged += (sender, args) =>
                {
                    UpdateShareButton();
                };
            }
            ;

            UpdateFormCaption();
            UpdateShareButton();

            view.SetIssueReportingMenuAvailablity(issueReportDialogPresenter.IsAvailable);
        }
Exemplo n.º 16
0
        public Presenter(
            ILogSourcesManager logSources,
            IUserDefinedFormatsManager udfManager,
            IRecentlyUsedEntities mru,
            Preprocessing.IManager logSourcesPreprocessings,
            IView view,
            Preprocessing.IStepsFactory preprocessingStepsFactory,
            Workspaces.IWorkspacesManager workspacesManager,
            SourcesList.IPresenter sourcesListPresenter,
            NewLogSourceDialog.IPresenter newLogSourceDialogPresenter,
            IHeartBeatTimer heartbeat,
            SharingDialog.IPresenter sharingDialogPresenter,
            HistoryDialog.IPresenter historyDialogPresenter,
            IPresentersFacade facade,
            SourcePropertiesWindow.IPresenter sourcePropertiesWindowPresenter,
            IAlertPopup alerts,
            ITraceSourceFactory traceSourceFactory,
            IChangeNotification changeNotification
            )
        {
            this.logSources = logSources;
            this.udfManager = udfManager;
            this.mru        = mru;
            this.view       = view;
            this.logSourcesPreprocessings    = logSourcesPreprocessings;
            this.preprocessingStepsFactory   = preprocessingStepsFactory;
            this.workspacesManager           = workspacesManager;
            this.newLogSourceDialogPresenter = newLogSourceDialogPresenter;
            this.sourcesListPresenter        = sourcesListPresenter;
            this.tracer = traceSourceFactory.CreateTraceSource("UI", "smgr-ui");
            this.sharingDialogPresenter          = sharingDialogPresenter;
            this.historyDialogPresenter          = historyDialogPresenter;
            this.sourcePropertiesWindowPresenter = sourcePropertiesWindowPresenter;
            this.alerts             = alerts;
            this.presentersFacade   = facade;
            this.changeNotification = changeNotification;

            sourcesListPresenter.DeleteRequested += (sender, args) =>
            {
                DeleteSelectedSources();
            };

            logSourcesPreprocessings.PreprocessingAdded += (sender, args) =>
            {
                if ((args.LogSourcePreprocessing.Flags & PreprocessingOptions.HighlightNewPreprocessing) != 0)
                {
                    preprocessingAwaitingHighlighting = args.LogSourcePreprocessing;
                    pendingUpdateFlag.Invalidate();
                }
            };

            heartbeat.OnTimer += (sender, args) =>
            {
                if (pendingUpdateFlag.Validate())
                {
                    UpdateView();
                }
            };

            view.SetViewModel(this);
        }