--- source_files: - DataPRO/DataPRO/Pages/ATDMonitorStatusPage.cs - DataPRO/DataPRO/Pages/CopyAndTrimPage.cs - DataPRO/DataPRO/Pages/RenameTestPage.cs - DataPRO/DataPRO/Pages/DownloadAndView.cs - DataPRO/DataPRO/Pages/TimedWaitControl.xaml.cs - DataPRO/DataPRO/Pages/ModalPage.xaml.cs - DataPRO/DataPRO/Pages/SplashScreen.xaml.cs - DataPRO/DataPRO/Pages/AddGraphPage.cs - DataPRO/DataPRO/Pages/StatusLinePage.cs - DataPRO/DataPRO/Pages/EditGraphPage.cs - DataPRO/DataPRO/Pages/RealtimePage.cs - DataPRO/DataPRO/Pages/DownloadDataPage.cs - DataPRO/DataPRO/Pages/ChangeView.xaml.cs - DataPRO/DataPRO/Pages/EditUserDetailsPage.cs - DataPRO/DataPRO/Pages/LoginControl2.xaml.cs - DataPRO/DataPRO/Pages/UsersPage.cs generated_at: "2026-04-17T15:46:52.496358+00:00" model: "zai-org/GLM-5-FP8" schema_version: 1 sha256: "ddb7d9cc557ee4d9" --- # DataPRO Pages Module Documentation ## 1. Purpose This module contains the page definitions and UI controls that comprise the main interface of the DataPRO application. It provides specialized pages for user management (authentication, user editing), test configuration and monitoring (ATD Monitor Status, Status Line Check, Realtime diagnostics), data export operations (Copy and Trim, Rename Test, Download and View), and graph management (Add/Edit Graph). All page classes inherit from a common `DataPROPage` base class (or `RunTestBase` for wizard-style pages) and implement a consistent pattern for navigation, button handling, and lifecycle management via `OnSetActive()` and `UnSet()` methods. --- ## 2. Public Interface ### ATDMonitorStatusPage ```csharp public class ATDMonitorStatusPage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `ATDMonitorStatusPage(DataModel.TabPageItem item)` | Initializes with transparent background, search control enabled, and creates an embedded `Controls.TestSetups.ATDMonitorStatus` control | | CurrentTest | `DataModel.TestTemplate` (setter only) | Forwards the test template to the internal `_statusControl` | | UniqueId | `string` | Returns constant `"TestSetups_ATDMonitorStatusPage"` | | UnSet | `void UnSet()` | Overrides base implementation (calls base only) | ### CopyAndTrimPage ```csharp public class CopyAndTrimPage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `CopyAndTrimPage(DataModel.TabPageItem item)` | Initializes with `UsesModifyEnhancements = true`, no save/next buttons | | UniqueId | `string` | Returns `"Review_ExportData_CopyAndTrim"` | | DownloadFolder | `string` | Gets/sets download folder path (default: `string.Empty`) | | IsROI | `bool` | Gets/sets ROI flag (default: `false`) | | TestItem | `string` | Gets/sets test item identifier | | AvailableTestIds | `List` | Gets/sets list of available test IDs | | DTSFilePath | `string` | Gets/sets DTS file path | ### RenameTestPage ```csharp public class RenameTestPage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `RenameTestPage(DataModel.TabPageItem item)` | Initializes similarly to `CopyAndTrimPage` with `UsesModifyEnhancements = true` | | UniqueId | `string` | Returns `"Review_ExportData_Rename"` | | AvailableTestNames | `List` | Gets/sets list of available test names (in addition to IDs from `CopyAndTrimPage`) | ### DownloadAndView ```csharp public class DownloadAndView : RunTestBase ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `DownloadAndView(DataModel.TabPageItem item)` | Basic constructor | | Constructor | `DownloadAndView(DataModel.TabPageItem item, int possibleSteps)` | Constructor with step count for wizard navigation | | UniqueId | `string` | Returns constant `"Record_DownloadAndView"` | | NavigateToROIDownload | `void NavigateToROIDownload()` | Sets current step to `_downloadROIControlNavStep` | | OnSetActive | `void OnSetActive()` | Resets `ROINext_OK` and `ALLNext_OK` flags, subscribes to `AutomaticModeStatusEvent` via `IEventAggregator` | | UnSet | `void UnSet()` | Clears search term and calls `StartSearch(string.Empty)` on `_downloadROIControl` | ### TimedWaitControl ```csharp public partial class TimedWaitControl : UserControl, INotifyPropertyChanged ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `TimedWaitControl()` | Parameterless constructor | | Constructor | `TimedWaitControl(MainWindow MainWindow)` | Constructor with main window reference | | ManualResetEvent | `System.Threading.ManualResetEvent` | Gets/sets synchronization primitive | | MarkDone | `void MarkDone()` | Signals the `ManualResetEvent` and sets it to null | | SetValuePercent | `void SetValuePercent(double d)` | Updates progress bar via `ctrlStatusRibbon.SetProgressValue()` | | SetActive | `void SetActive()` | Empty implementation | | SetStatusMessage | `void SetStatusMessage(string msg)` | Sets status text via `ctrlStatusRibbon.SetStatusTextNoTranslate()` | | CancelButtonVisibility | `Visibility` | Bindable property for cancel button visibility | | PropertyChanged | `event PropertyChangedEventHandler` | INotifyPropertyChanged implementation | ### ModalPage ```csharp public partial class ModalPage : UserControl, INotifyPropertyChanged ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `ModalPage()` | Parameterless constructor | | Constructor | `ModalPage(MainWindow MainWindow)` | Constructor with main window reference | | SetContent | `void SetContent(IModalContent content)` | Sets modal content, calls `OnSetActive()`, assigns `CloseFunction` | | OnCloseDelegate | `delegate void OnCloseDelegate()` | Delegate type for close callbacks | #### IModalContent Interface ```csharp public interface IModalContent ``` | Member | Signature | Description | |--------|-----------|-------------| | DialogResult | `System.Windows.Forms.DialogResult` | Gets the dialog result | | CloseFunction | `OnCloseDelegate` | Gets/sets the close callback | | OnSetActive | `void OnSetActive()` | Called when content becomes active | | PromptString | `string` | Gets/sets prompt text | | ReusableMessageBox | `bool` | Flag for reusable message box scenarios | | SetButtons | `void SetButtons(PageButton[] buttons)` | Sets page buttons | | DefaultButton | `PageButton` | Gets/sets the default button | ### SplashScreen ```csharp public partial class SplashScreen : Window ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `SplashScreen()` | Initializes with Xceed license key, `ShowInTaskbar = false`, `ResizeMode = NoResize` | | Version | `string` (setter) | Sets `txt_VersionString.Text` | | DbVersion | `string` (setter) | Sets `txt_DbVersionString.Text` | | LicensedTo | `string` (setter) | Sets `txt_LicensedTo.Text` | | LicenseType | `DataProLicensingEnums.LicenseType` | Gets/sets license type; setter calls `SetBackgroundImage()` | | Copyright | `string` (setter) | Sets `txt_Copyright.Text` | | SetBackgroundImage | `void SetBackgroundImage()` | Updates banner image based on `RunTestVariables.IsTSRAIRGo` and `LicenseType` | ### AddGraphPage ```csharp public class AddGraphPage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `AddGraphPage(DataModel.TabPageItem item)` | Initializes with no search/select controls, no next/back buttons | | UniqueId | `string` | Returns `"Review_ViewData_AddGraph"` | | saveButton | `Controls.PageButton` | Public field for Save button | | saveAsButton | `Controls.PageButton` | Public field for Save As button | | saveAndAddAnotherButton | `Controls.PageButton` | Public field for Save and Add Another button | | AddPageButtons | `void AddPageButtons()` | Creates Cancel, Save, SaveAs, SaveAndAddAnother, View buttons | | OnButtonPress | `bool OnButtonPress(Controls.PageButton button)` | Handles button presses; View and Cancel navigate to previous page | ### StatusLinePage ```csharp public class StatusLinePage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `StatusLinePage(DataModel.TabPageItem item)` | Creates `Controls.TestSetupsControl` with `Color_ApplicationTileCalibration` | | UniqueId | `string` | Returns constant `"Diagnostics_StatusLineCheck"` | | OnSetActive | `void OnSetActive()` | Calls `SetRunButtonEnabled()` | | OnButtonPress | `bool OnButtonPress(Controls.PageButton button)` | Handles `Record_StatusLineCheckRunButton` to call `SetNewTest()` | ### EditGraphPage ```csharp public class EditGraphPage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `EditGraphPage(DataModel.TabPageItem item)` | Initializes similarly to `AddGraphPage` | | UniqueId | `string` | Returns `"Review_ViewData_EditGraph"` | | IsSingleChannelGraph | `bool` | Setter disables `saveButton` when `true` | | saveButton, saveAsButton, saveAndEditAnotherButton | `Controls.PageButton` | Public button fields | | OnButtonPress | `bool OnButtonPress(Controls.PageButton button)` | Handles button presses; SaveAndEditAnother, View, and Cancel navigate to previous page | ### RealtimePage ```csharp public class RealtimePage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `RealtimePage(DataModel.TabPageItem item)` | Creates `Controls.TestSetupsControl` with `Color_ApplicationTileCalibration` | | UniqueId | `string` | Returns constant `"Diagnostics_Realtime"` | | OnButtonPress | `bool OnButtonPress(Controls.PageButton button)` | Handles `Record_RealtimeRunButton`, logs user action via `APILogger.Log()` | ### DownloadDataPage ```csharp public class DownloadDataPage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `DownloadDataPage(DataModel.TabPageItem item)` | Creates `Controls.TestSetupsControl` with `Color_ApplicationTileCollectData` | | UniqueId | `string` | Returns constant `"Record_DownloadAndView"` | | OnButtonPress | `bool OnButtonPress(Controls.PageButton button)` | Handles `Record_DownloadData_RunButton`, logs user action via `APILogger.Log()` | ### ChangeView ```csharp public partial class ChangeView : Window, INotifyPropertyChanged ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `ChangeView()` | Subscribes to `Activated` and `Deactivated` events | | AvailableUsers | `User[]` | Gets/sets all available users for selection | | FilteredUsers | `User[]` | Gets filtered users based on `tbSearch.Text` (searches `UserName` and `Name` fields) | | OK_Click | `void OK_Click(object sender, RoutedEventArgs e)` | Calls `App.ChangeView()` and `MainWindow.CloseChangeView()` | | Cancel_Click | `void Cancel_Click(object sender, RoutedEventArgs e)` | Calls `MainWindow.CloseChangeView()` | | Window_Closing | `void Window_Closing(object sender, CancelEventArgs e)` | Cancels close and calls `CloseChangeView()` instead | ### EditUserDetailsPage ```csharp public class EditUserDetailsPage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `EditUserDetailsPage(DataModel.TabPageItem item)` | Creates three NavSteps with `EditUserInfoControl`, `EditUserPermissionsControl`, `EditUserVisibilityControl` | | UniqueId | `string` | Returns `"Admin_Users_EditUserDetails_Page"` | | IsAddPage | `bool` | Controls add/edit mode; setter updates `IsAdd` and `_userInfoControl.IsAdd` | | CurrentUser | `DTS.Slice.Users.User` | Gets/sets current user; propagates to all child controls | | OnSetActive | `void OnSetActive()` | Sets modified state to `Unmodified`, resets nav to first step | | SaveAndExitButtonPress | `void SaveAndExitButtonPress()` | Validates, commits via `UserCollection.UsersList.Commit()`, navigates to previous page | | SaveButtonPress | `void SaveButtonPress()` | Validates and commits without navigation | | Validate | `bool Validate(ref List errors, ref List warnings, bool displayWindow)` | Aggregates validation from all three child controls | ### LoginControl2 ```csharp public partial class LoginControl2 : UserControl, INotifyPropertyChanged ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `LoginControl2()` | Parameterless constructor, sets version string | | Constructor | `LoginControl2(MainWindow MainWindow)` | Constructor with main window reference | | Users | `UserData[]` | Gets sorted, filtered user list from `UserCollection.GetAllUsers()` | | RememberPassword | `bool` | Gets/sets remember password flag | | SetActive | `void SetActive()` | Navigates to home page if current user matches default | | UpdateUsers | `void UpdateUsers()` | Raises `PropertyChanged` for `Users` | | button_Click | `void button_Click(object sender, RoutedEventArgs e)` | Handles login via `App.LoginUser()`, optionally saves credentials, shows license prompts | ### UsersPage ```csharp public class UsersPage : DataPROPage ``` | Member | Signature | Description | |--------|-----------|-------------| | Constructor | `UsersPage(DataModel.TabPageItem item)` | Creates `Controls.UserListControl` with transparent background | | UniqueId | `string` | Returns `"Admin_Users"` | | OnSetActive | `void OnSetActive()` | Updates user list, publishes `ProgressBarEvent` | | OnButtonPress | `bool OnButtonPress(Controls.PageButton button)` | Handles Add, Edit, Delete buttons | | ChallengeUserDelete | `void ChallengeUserDelete(User[] users)` | Shows confirmation dialog, performs deletion via `UserCollection.UsersList.Delete()` | | SetPagePermissions | `void SetPagePermissions()` | Restricts buttons based on admin status and license type (TSRAIR, Standard, StandardSite disable Add) | --- ## 3. Invariants 1. **UniqueId Consistency**: Every page must return a constant string from `UniqueId` property. This is used for page identification and navigation. 2. **Constructor Pattern**: All `DataPROPage`-derived classes must accept a `DataModel.TabPageItem` parameter passed to the base constructor. 3. **Button Handling Pattern**: Button presses are handled via `OnButtonPress(PageButton button)` with `Enum.TryParse` to match button IDs defined in nested `ButtonIds` enums. 4. **User Deletion Rules** (UsersPage): - Default users (Admin, PowerUser, User, Guest) cannot be deleted unless they are duplicates without default IDs - Users cannot delete themselves - Delete button visibility is controlled by `IsADefault