Files
2026-04-17 14:55:32 -04:00

240 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
source_files:
- Common/DTS.Common/Controls/RoundedBox.xaml.cs
- Common/DTS.Common/Controls/TestIDView.xaml.cs
- Common/DTS.Common/Controls/checkbox.xaml.cs
- Common/DTS.Common/Controls/GridLengthAnimation.cs
- Common/DTS.Common/Controls/ISOPopup.xaml.cs
- Common/DTS.Common/Controls/LookupPopup.xaml.cs
- Common/DTS.Common/Controls/TestIdPreFixSuffixHelper.cs
- Common/DTS.Common/Controls/AutoSizedGridView.cs
- Common/DTS.Common/Controls/TestIDTestBox.xaml.cs
- Common/DTS.Common/Controls/DynamicGrid.cs
- Common/DTS.Common/Controls/TestIDViewModel.cs
- Common/DTS.Common/Controls/TestIDControl.xaml.cs
- Common/DTS.Common/Controls/GridViewColumnHeaderSelectable.xaml.cs
- Common/DTS.Common/Controls/IPTextBox.xaml.cs
- Common/DTS.Common/Controls/GridViewColumnHeaderSearchable.xaml.cs
generated_at: "2026-04-16T02:54:39.689905+00:00"
model: "Qwen/Qwen3-Coder-Next-FP8"
schema_version: 1
sha256: "65aa3f7b7e06fc1f"
---
# DTS.Common.Controls Module Documentation
## 1. Purpose
This module provides a collection of WPF UI controls and supporting utilities for the DTS (Device Test System) application. It includes specialized input controls (e.g., `IPTextBox`, `TestIDTextBox`), layout helpers (`DynamicGrid`, `GridLengthAnimation`), and test ID management components (`TestIdPreFixSuffixHelper`, `TestIDViewModel`, `TestIdControl`). These controls extend standard WPF functionality to support domain-specific requirements such as structured test ID generation, IP address entry validation, dynamic grid layout, and column header interactions (selectable/searchable headers with popups). The module serves as a foundational UI component library for test setup and execution interfaces.
## 2. Public Interface
### Classes
#### `RoundedBox`
- **`public void Connect(int connectionId, object target)`**
Placeholder method intended for connection logic; currently throws `NotImplementedException`.
#### `TestIDView`
- No public methods or properties exposed beyond default `UserControl` behavior.
#### `checkbox`
- **`public void ToolTipEventHandler(object sender, ToolTipEventArgs e)`**
Handles tooltip requests by publishing a `HelpTextEvent` via Prism's `IEventAggregator`, including the sender and event args in the `HelpTextEventArg`.
#### `GridLengthAnimation`
- **`public GridLength From { get; set; }`**
Starting `GridLength` value for the animation.
- **`public GridLength To { get; set; }`**
Ending `GridLength` value for the animation.
- **`public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock)`**
Computes interpolated `GridLength` value based on animation progress, preserving `GridUnitType` (Star/Pixel) from the `To` value.
#### `ISOPopup`
- **`private void ISOPart_OnPreviewKeyUp(object sender, KeyEventArgs e)`**
Filters keyboard input in child controls to allow only alphanumeric keys, numeric pad digits, control keys (Enter, Tab, Backspace, etc.), and the `OemQuestion` key.
- **`private void ISOPart_OnGotMouseCapture(object sender, MouseEventArgs e)`**
Selects all text in a `TextBox` when it receives mouse capture.
- **`private void ISOPart_OnGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)`**
Selects all text in a `TextBox` when it receives keyboard focus.
#### `LookupPopup`
- **`public event ChannelCodeSelectedEventHandler ChannelCodeSelected`**
Event raised when a channel code is selected (via double-click on a `DataGrid` item).
- **`public IList PossibleChannels { get; set; }`**
Dependency property backing the list of available channel codes.
- **`public delegate void ChannelCodeSelectedEventHandler(object sender, string code, string name)`**
Delegate for the `ChannelCodeSelected` event.
- **`private void PossibleChannels_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)`**
Extracts `Code` and `Name` properties from the selected item and raises `ChannelCodeSelected`.
#### `TestIdPreFixSuffixHelper`
- **`public TestIdPreFixSuffix TestIdPreFixSuffix { get; }`**
Encapsulated prefix/suffix configuration.
- **`public override string ToString()`**
Returns localized string via `Strings.Strings.ResourceManager`, or the raw value if not found.
#### `AutoSizedGridView`
- **`protected override void PrepareItem(ListViewItem item)`**
Ensures columns with `Width="Auto"` (unbound) are correctly measured and re-measured when items are prepared. Handles re-binding of width-bound columns if binding is lost.
#### `TestIDTextBox`
- **`public string Text { get; set; }`**
Dependency property for the full test ID text value.
- **`public void Clear()`**
Clears the internal `tbTestId` text box.
- **`private static bool IsValidText(string text)`**
Validates text against invalid filename/path characters and the period (`.`) character.
#### `DynamicGrid`
- **`public byte GridColumns { get; set; }`**
Number of columns in the grid; changing this triggers a layout refresh.
- **`public void Refresh()`**
Recalculates column and row definitions and assigns children to grid cells in row-major order. Adds a final star-width column and row for expansion.
#### `TestIDViewModel`
- **`public string TestSetupLabel { get; set; }`**
Label for test setup; affects `TestSetupLabelVisibility`.
- **`public Visibility TestSetupLabelVisibility { get; }`**
`Visibility.Visible` if `TestSetupLabel` is non-empty, else `Collapsed`.
- **`public string TestIdEditableText { get; set; }`**
User-editable portion of the test ID.
- **`public void PopulateAllTestIdPrefixSuffixValues(string[] serializedValues)`**
Initializes list of available prefix/suffix options from DB values.
- **`public TestIdPreFixSuffixHelper[] AllTestIdPrefixSuffixValues { get; }`**
Read-only array of available prefix/suffix helpers.
- **`public TestIdPreFixSuffixHelper SelectedTestIdPrefixValueItem { get; set; }`**
Currently selected prefix helper (default: `None`).
- **`public TestIdPreFixSuffixHelper SelectedTestIdSuffixValueItem { get; set; }`**
Currently selected suffix helper (default: `TimeStamp`).
- **`public string TestName { get; set; }`**
Test name used when prefix/suffix is `TestSetupName`.
- **`public string GetTestId()`**
Constructs test ID by concatenating prefix, test setup label, editable text, and suffix with underscores.
- **`private string GetRunTimeTestIdPrefixOrSuffix(TestIdPreFixSuffixHelper prefixOrSuffix)`**
Resolves runtime value for a prefix/suffix helper (e.g., timestamp or test name).
- **`public string GetTestIdTimestamp()`**
Returns current timestamp as `yyyy_MM_dd HH_mm`.
#### `TestIdControl`
- **`public string TestSetupLabel { get; set; }`**
Same as in `TestIDViewModel`.
- **`public Visibility TestSetupLabelVisibility { get; }`**
Same as in `TestIDViewModel`.
- **`public string TestIdEditableText { get; set; }`**
Same as in `TestIDViewModel`.
- **`public void PopulateAllTestIdPrefixSuffixValues(string[] serializedValues)`**
Same as in `TestIDViewModel`.
- **`public TestIdPreFixSuffixHelper[] AllTestIdPrefixSuffixValues { get; }`**
Same as in `TestIDViewModel`.
- **`public TestIdPreFixSuffixHelper SelectedTestIdPrefixValueItem { get; set; }`**
Same as in `TestIDViewModel`.
- **`public TestIdPreFixSuffixHelper SelectedTestIdSuffixValueItem { get; set; }`**
Same as in `TestIDViewModel`.
- **`public string TestName { get; set; }`**
Same as in `TestIDViewModel`.
- **`public string GetTestId()`**
Same as in `TestIDViewModel`.
- **`private string GetRunTimeTestIdPrefixOrSuffix(TestIdPreFixSuffixHelper prefixOrSuffix)`**
Same as in `TestIDViewModel`.
- **`public string GetTestIdTimestamp()`**
Same as in `TestIDViewModel`.
#### `GridViewColumnHeaderSelectable`
- **`public string ListviewId { get; set; }`**
Identifier for the associated `ListView`.
- **`public string HeaderTitle { get; set; }`**
Display title for the header.
- **`public bool ToggleButtonIsChecked { get; set; }`**
Controls popup state; raises `OpenChanged` event on change.
- **`public event RoutedEventHandler OpenChanged`**
Raised when popup state changes.
- **`public event RoutedEventHandler ClickHandler`**
Raised on header click.
- **`public event RoutedEventHandler SelectAll`**
Raised when "Select All" or "Clear All" buttons are clicked.
#### `IPTextBox`
- **`public string Address { get; set; }`**
Dependency property for full IP address string (e.g., `"192.168.1.1"`).
- **`public void Clear()`**
Clears all four internal `TextBox` segments.
#### `GridViewColumnHeaderSearchable`
- **`public string ListviewId { get; set; }`**
Identifier for the associated `ListView`.
- **`public string HeaderTitle { get; set; }`**
Display title for the header.
- **`public bool ToggleButtonIsChecked { get; set; }`**
Controls popup state; raises `OpenChanged` event on change.
- **`public string HeaderSearchTerm { get; set; }`**
Current search term; raises `Search` event on change.
- **`public Geometry ToggleIconGeometry { get; }`**
Returns arrow or filter icon geometry based on search term presence.
- **`public event RoutedEventHandler OpenChanged`**
Raised when popup state changes.
- **`public event RoutedEventHandler Search`**
Raised when search term changes.
### Enums
#### `TestIdFixedPrefixSuffixValues`
- `NotFixed = -1`
- `None = 0`
- `TimeStamp = 1`
- `TestSetupName = 2`
## 3. Invariants
- **`GridLengthAnimation.GetCurrentValue`**:
The `GridUnitType` of the result is determined solely by the `To.IsStar` property; `From`'s unit type is ignored.
- **`IPTextBox` input validation**:
Only digits (09, including Numpad), period (`.`/`OemPeriod`/`Decimal`), navigation keys (Left/Right), Backspace, Tab, and Delete are allowed. Clipboard operations (Ctrl+C/V/A/X) are permitted.
- **`TestIDTextBox` text validation**:
Text must not contain any characters from `Path.GetInvalidFileNameChars()`, `Path.GetInvalidPathChars()`, or `.` (period).
- **`DynamicGrid.Refresh()`**:
- Columns are created with `Auto` width for all but the last column, which is `Star`.
- Rows are created with `Auto` height for all but the last row, which is `Star`.
- Children are assigned to grid cells in row-major order.
- **`ISOPopup` key filtering**:
Only alphanumeric keys (AZ, 09), Numpad digits (NumPad0NumPad9), control keys (Enter, Tab, Backspace, Delete, Home, End), and `OemQuestion` are allowed.
- **`TestIdPreFixSuffixHelper.ToString()`**:
Returns a localized string if available (via `Strings.Strings.ResourceManager`), otherwise returns the raw internal string.
## 4. Dependencies
### Dependencies *on* this module:
- **`DTS.Common.Events`**: Used by `checkbox` (for `HelpTextEvent`), `GridViewColumnHeaderSelectable`, and `GridViewColumnHeaderSearchable` (for `ListViewStatusEvent`).
- **`Prism.Ioc` / `Prism.Events`**: Used by `checkbox`, `GridViewColumnHeaderSelectable`, and `GridViewColumnHeaderSearchable` (for `IEventAggregator` and `ContainerLocator`).
- **`DTS.Common.Interface.Channels.ChannelCodes`**: Used by `LookupPopup` (for `IChannelCode`).
- **`DTS.Common.Base`**: Used by `GridViewColumnHeaderSelectable` and `GridViewColumnHeaderSearchable` (for `IBasePropertyChanged`).
- **`DTS.Common.Utilities.Logging`**: Used by `GridViewColumnHeaderSelectable` and `GridViewColumnHeaderSearchable` (for logging utilities).
- **`DTS.Common`**: Used by `TestIdPreFixSuffixHelper` (for `Base.BasePropertyChanged`).
### Dependencies *of* this module:
- **WPF Framework**: `System.Windows`, `System.Windows.Controls`, `System.Windows.Media`, `System.Windows.Media.Animation`, `System.Windows.Input`, `System.Windows.Shapes`, `System.Windows.Navigation`, `System.Windows.Data`, `System.Windows.Controls.Primitives`.
- **Prism Library**: `Prism.Ioc`, `Prism.Events`.
- **.NET Base Libraries**: `System`, `System.Collections.Generic`, `System.ComponentModel`, `System.IO`, `System.Linq`, `System.Threading.Tasks`.
## 5. Gotchas
- **`RoundedBox.Connect` is unimplemented**: The method throws `NotImplementedException`; callers must not invoke it.
- **`BoolToInvertedBoolConverter.ConvertBack` is not implemented**: Throwing `NotImplementedException` if used in two-way bindings.
- **`TestIdControl` is deprecated**: The class summary explicitly states: *"Remove this control after deleting the TTS module and migrating to new test setup wizard"*.
- **`TestIDTextBox` and `IPTextBox` share similar validation logic**: Both validate against invalid path/filename characters, but `TestIDTextBox` additionally forbids `.` while `IPTextBox` requires it.
- **`DynamicGrid.Refresh()` behavior**:
- The last column is always `Star` width, and the last row is always `Star` height, regardless of content.
- If `GridColumns` is set to 0, `Refresh()` will create no columns, potentially breaking layout.
- **`GridViewColumnHeaderSelectable`/`Searchable` event subscription**:
Both subscribe to `ListViewStatusEvent` in their constructor. If `ListviewId` is not set correctly, the event handler may not clear search terms on `ListView` unload.
- **`TestIdPreFixSuffixHelper` equality semantics**:
`Equals()` returns `base.Equals()` if `FixedValue != NotFixed`, but compares string representations only if `FixedValue == NotFixed`. This may lead to unexpected equality results for non-`NotFixed` values.
- **`TestIDViewModel`/`TestIdControl` timestamp format**:
`GetTestIdTimestamp()` uses space (` `) as separator between date and time (`yyyy_MM_dd HH_mm`), which may cause issues in file system contexts.
- **`LookupPopup` reflection usage**:
`PossibleChannels_OnMouseDoubleClick` uses reflection (`GetProperty("Code")?.GetValue(...)`) to extract `Code`/`Name` from items; this assumes all items have these properties and may fail silently if they do not.