Files

240 lines
14 KiB
Markdown
Raw Permalink Normal View History

2026-04-17 14:55:32 -04:00
---
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.