This commit is contained in:
2026-04-17 14:55:32 -04:00
commit bc3ac1d4c9
18017 changed files with 4371742 additions and 0 deletions

View File

@@ -0,0 +1 @@
12

View File

@@ -0,0 +1 @@
12

View File

@@ -0,0 +1,140 @@
using System;
using System.Windows.Media.Imaging;
using DTS.Common;
using DTS.Common.Interface;
using DTS.Viewer.ChartOptions;
using DTS.Viewer.ChartOptions.Model;
using Prism.Ioc;
using Prism.Modularity;
using Unity;
// ReSharper disable RedundantAttributeUsageProperty
// ReSharper disable UnusedParameter.Local
[assembly: ChartOptionsModuleName()]
[assembly: ChartOptionsModuleImageAttribute()]
namespace DTS.Viewer.ChartOptions
{
[Module(ModuleName = "DTS.Viewer.ChartOptions")]
public class ChartOptionsModule : IModule
{
/// <summary>
/// Injected unity container
/// </summary>
private readonly IUnityContainer _unityContainer;
/// <summary>
/// Initializes a new instance of the <see cref="ChartOptionsModule"/> class.
/// </summary>
/// <param name="unityContainer">Obtained reference of the unity container by using dependency injection.</param>
public ChartOptionsModule(IUnityContainer unityContainer)
{
_unityContainer = unityContainer;
}
public void Initialize()
{
// Register View & View-Model with Unity dependency injection container as a singleton.
_unityContainer.RegisterType<IChartOptionsView, ChartOptionsView>();
_unityContainer.RegisterType<IChartOptionsViewModel, ChartOptionsViewModel>();
_unityContainer.RegisterType<IChartOptionsModel, ChartOptionsModel>();
}
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
Initialize();
}
}
/// <summary>
/// Attribute class contains assembly name
/// </summary>
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
public class ChartOptionsModuleNameAttribute : TextAttribute
{
public ChartOptionsModuleNameAttribute() : this(null) { }
public ChartOptionsModuleNameAttribute(string s)
{
AssemblyName = AssemblyNames.ChartOptions.ToString();
}
public override string AssemblyName { get; }
public override Type GetAttributeType()
{
return typeof(TextAttribute);
}
public override string GetAssemblyName()
{
return AssemblyName;
}
}
/// <summary>
/// Attribute class contains assembly image and name - used on the Main screen to ChartOptions available components
/// </summary>
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
public class ChartOptionsModuleImageAttribute : ImageAttribute
{
private BitmapImage _img;
public ChartOptionsModuleImageAttribute() : this(null) { }
public override BitmapImage AssemblyImage
{
get { _img = AssemblyInfo.GetImage(AssemblyNames.ChartOptions.ToString()); return _img; }
}
public ChartOptionsModuleImageAttribute(string s)
{
_img = AssemblyInfo.GetImage(AssemblyNames.ChartOptions.ToString());
}
public override Type GetAttributeType()
{
return typeof(ImageAttribute);
}
public override BitmapImage GetAssemblyImage()
{
return AssemblyImage;
}
private string _name;
public override string AssemblyName
{
get { _name = AssemblyNames.ChartOptions.ToString(); return _name; }
}
public override string GetAssemblyName()
{
return AssemblyName;
}
private string _group;
public override string AssemblyGroup
{
get { _group = eAssemblyGroups.Viewer.ToString(); return _group; }
}
public override string GetAssemblyGroup()
{
return AssemblyGroup;
}
private eAssemblyRegion _region;
public override eAssemblyRegion AssemblyRegion
{
get { _region = eAssemblyRegion.ChartOptionsRegion; return _region; }
}
public override eAssemblyRegion GetAssemblyRegion()
{
return AssemblyRegion;
}
}
}

View File

@@ -0,0 +1,160 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ChartUnitType" xml:space="preserve">
<value>Chart Unit Type</value>
</data>
<data name="FilterOptions_Title" xml:space="preserve">
<value>Display Filter</value>
<comment>Title for Display Filter Options GroupBox</comment>
</data>
<data name="LockT" xml:space="preserve">
<value>Lock T</value>
</data>
<data name="MaxT" xml:space="preserve">
<value>Max:</value>
</data>
<data name="MaxY" xml:space="preserve">
<value>Max:</value>
</data>
<data name="MinT" xml:space="preserve">
<value>Min:</value>
</data>
<data name="MinY" xml:space="preserve">
<value>Min:</value>
</data>
<data name="Range" xml:space="preserve">
<value>Range</value>
</data>
<data name="ResetAll" xml:space="preserve">
<value>Reset All</value>
</data>
<data name="ResetT" xml:space="preserve">
<value>Reset T</value>
</data>
<data name="SaveChart" xml:space="preserve">
<value>Save Chart</value>
</data>
<data name="SaveToPDF" xml:space="preserve">
<value>Save to PDF</value>
</data>
<data name="TimeUnitType" xml:space="preserve">
<value>Time Unit Type</value>
</data>
</root>

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9F161F2A-4FCD-438E-9768-BA96BA104D6C}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DTS.Viewer.ChartOptions</RootNamespace>
<AssemblyName>DTS.Viewer.ChartOptions</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SccProjectName>
</SccProjectName>
<SccLocalPath>
</SccLocalPath>
<SccAuxPath>
</SccAuxPath>
<SccProvider>
</SccProvider>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="C1.WPF.4, Version=4.0.20163.541, Culture=neutral, PublicKeyToken=2aa4ec5576d6c3ce, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.WPF.4.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Practices.ServiceLocation">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Microsoft.Practices.ServiceLocation.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Xaml.Behaviors">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Microsoft.Xaml.Behaviors.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="Prism">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Prism.dll</HintPath>
</Reference>
<Reference Include="Prism.Unity.Wpf">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Prism.Unity.Wpf.dll</HintPath>
</Reference>
<Reference Include="Prism.Wpf">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Prism.Wpf.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Windows" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="Unity.Abstractions">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Unity.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Unity.Container">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Unity.Container.dll</HintPath>
</Reference>
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="ChartOptionsModule.cs" />
<Compile Include="Model\ChartOptionsModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Resources\StringResources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>StringResources.resx</DependentUpon>
</Compile>
<Compile Include="Resources\TranslateExtension.cs" />
<Compile Include="ViewModel\ChartOptionsViewModel.cs" />
<Compile Include="View\ChartOptionsView.xaml.cs">
<DependentUpon>ChartOptionsView.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Page Include="Resources\CheckBoxSlider.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Resources\ChartOptionsResources.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="View\ChartOptionsView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\StringResources.ja.resx" />
<EmbeddedResource Include="Resources\StringResources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>StringResources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Common\DTS.Common.Core\DTS.Common.Core.csproj">
<Project>{fab1f470-1574-4301-b56e-d3364aa93679}</Project>
<Name>DTS.Common.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Common\DTS.Common\DTS.Common.csproj">
<Project>{114edc77-f3b5-4576-a91b-40818d503b55}</Project>
<Name>DTS.Common</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\DataPRO\SensorDB\SensorDB.csproj">
<Project>{444ef10c-046e-47ad-a9a5-17318d488723}</Project>
<Name>SensorDB</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,180 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace DTS.Viewer.ChartOptions.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class StringResources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal StringResources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DTS.Viewer.ChartOptions.Resources.StringResources", typeof(StringResources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Chart Unit Type.
/// </summary>
internal static string ChartUnitType {
get {
return ResourceManager.GetString("ChartUnitType", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Display Filter.
/// </summary>
internal static string FilterOptions_Title {
get {
return ResourceManager.GetString("FilterOptions_Title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lock T.
/// </summary>
internal static string LockT {
get {
return ResourceManager.GetString("LockT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Max:.
/// </summary>
internal static string MaxT {
get {
return ResourceManager.GetString("MaxT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Max:.
/// </summary>
internal static string MaxY {
get {
return ResourceManager.GetString("MaxY", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Min:.
/// </summary>
internal static string MinT {
get {
return ResourceManager.GetString("MinT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Min:.
/// </summary>
internal static string MinY {
get {
return ResourceManager.GetString("MinY", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Range.
/// </summary>
internal static string Range {
get {
return ResourceManager.GetString("Range", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reset All.
/// </summary>
internal static string ResetAll {
get {
return ResourceManager.GetString("ResetAll", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reset T.
/// </summary>
internal static string ResetT {
get {
return ResourceManager.GetString("ResetT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Save Chart.
/// </summary>
internal static string SaveChart {
get {
return ResourceManager.GetString("SaveChart", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Save to PDF.
/// </summary>
internal static string SaveToPDF {
get {
return ResourceManager.GetString("SaveToPDF", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Time Unit Type.
/// </summary>
internal static string TimeUnitType {
get {
return ResourceManager.GetString("TimeUnitType", resourceCulture);
}
}
}
}

View File

@@ -0,0 +1,21 @@
using System;
using System.Windows.Markup;
using DTS.Viewer.ChartOptions.Resources;
namespace DTS.Viewer.ChartOptions
{
[MarkupExtensionReturnType(typeof(string))]
public class TranslateExtension : MarkupExtension
{
private readonly string _key;
public TranslateExtension(string key) { _key = key; }
private const string NotFound = "#stringnotfound#";
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (string.IsNullOrEmpty(_key)) { return NotFound; }
return StringResources.ResourceManager.GetString(_key) ?? NotFound + " " + _key;
}
}
}

View File

@@ -0,0 +1,270 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using DTS.Common;
using DTS.Common.Classes.Sensors;
using DTS.Common.Enums.Viewer;
using DTS.Common.Interface;
using DTS.Common.Interface.Sensors.SoftwareFilters;
using Prism.Commands;
// ReSharper disable EmptyConstructor
// ReSharper disable RedundantDefaultMemberInitializer
// ReSharper disable UnassignedGetOnlyAutoProperty
namespace DTS.Viewer.ChartOptions.Model
{
public class ChartOptionsModel : Common.Base.BasePropertyChanged, IChartOptionsModel
{
private bool _bDisplayingVolts = false;
/// <summary>
/// indicates if current mV option is for Volts or mV
/// </summary>
public bool DisplayingVolts
{
get => _bDisplayingVolts;
set
{
SetProperty(ref _bDisplayingVolts, value, "DisplayingVolts");
OnPropertyChanged("MVOrV");
OnPropertyChanged("UnitTypeDescription");
}
}
/// <summary>
/// returns mV or V depending on DisplayingVolts value
/// </summary>
public string MVOrV => DisplayingVolts ? "V" : "mV";
public ChartOptionsModel()
{
}
#region Properties
private bool _isDigitalChannel = false;
public bool IsDigitalChannel { get { return _isDigitalChannel; } set { SetProperty(ref _isDigitalChannel, value, "IsDigitalChannel"); } }
private bool _supportsADC = true;
public bool SupportsADC
{
get => _supportsADC;
set
{
SetProperty(ref _supportsADC, value, "SupportsADC");
}
}
private bool _supportsMV = true;
public bool SupportsMV
{
get => _supportsMV;
set
{
SetProperty(ref _supportsMV, value, "SupportsMV");
}
}
private ChartUnitTypeEnum _unitType = ChartUnitTypeEnum.EU;
public ChartUnitTypeEnum UnitType
{
get => _unitType;
set
{
if (_unitType.Equals(value)) return;
_unitType = value;
ReadData = true;
// FB 13120 does not need to set SelectedFilter any more since it's not using enum
if (_unitType != ChartUnitTypeEnum.EU && _unitType != ChartUnitTypeEnum.PSD) { Filter = FilterOptionEnum.Unfiltered; }
else { Filter = FilterOptionEnum.TestSetupDefault; }
OnPropertyChanged("UnitType");
OnPropertyChanged("UnitTypeDescription");
}
}
private string _unitTypeDescription = ChartUnitTypeEnum.EU.ToString();
public string UnitTypeDescription
{
get
{
if (UnitType == ChartUnitTypeEnum.mV)
{
return DisplayingVolts ? "V" : "mV";
}
return UnitType.ToString();
}
}
private TimeUnitTypeEnum _timeUnitType = TimeUnitTypeEnum.MS;
public TimeUnitTypeEnum TimeUnitType
{
get => _timeUnitType;
set
{
if (_timeUnitType.Equals(value)) return;
_timeUnitType = value;
ReadData = true;
TimeUnitTypeDescription = _timeUnitType.ToString();
OnPropertyChanged("TimeUnitType");
}
}
private string _timeUnitTypeDescription = TimeUnitTypeEnum.MS.ToString();
public string TimeUnitTypeDescription
{
get => _timeUnitTypeDescription;
set
{
if (_timeUnitTypeDescription.Equals(value)) return;
_timeUnitTypeDescription = value;
OnPropertyChanged("TimeUnitTypeDescription");
}
}
//FB 13120 use filter class instead of cfc filter enum
private IFilterClass _selectedFilter = new FilterClass(Common.Enums.Sensors.FilterClassType.Unfiltered);
public IFilterClass SelectedFilter { get => _selectedFilter; set { _selectedFilter = value; ReadData = true; OnPropertyChanged("SelectedFilter"); } }
public void SetSelectedFilterToUnfilteredNoRead()
{
_selectedFilter = new FilterClass(Common.Enums.Sensors.FilterClassType.Unfiltered);
ReadData = false;
OnPropertyChanged("SelectedFilter");
}
#region Min/Max Fixed Y
private double _minFixedY = 0.00;
public double MinFixedY { get => _minFixedY; set { if (_minFixedY.Equals(value)) return; _minFixedY = value; OnPropertyChanged("MinFixedY"); } }
private double _maxFixedY = 0.00;
public double MaxFixedY { get => _maxFixedY; set { if (_maxFixedY.Equals(value)) return; _maxFixedY = value; OnPropertyChanged("MaxFixedY"); } }
#endregion Min/Max Fixed Y
#region Min/Max Fixed X
private double _minFixedT = 0.00;
public double MinFixedT { get => _minFixedT; set { if (_minFixedT.Equals(value)) return; _minFixedT = value; OnPropertyChanged("MinFixedT"); } }
private double _maxFixedT = 0.00;
public double MaxFixedT { get => _maxFixedT; set { if (_maxFixedT.Equals(value)) return; _maxFixedT = value; OnPropertyChanged("MaxFixedT"); } }
#endregion Min/Max Fixed X
private List<double> _fullScaleValues = new List<double> { 200D, 100D, 50D, 20D, 10D, 5D, 1D, 0.1D };
private readonly List<double> _euValues = new List<double> { 5000, 2500, 1000, 500, 100, 50, 10, 5 };
public List<double> FullScaleValues { get => UnitType == ChartUnitTypeEnum.EU || UnitType == ChartUnitTypeEnum.PSD ? _euValues : _fullScaleValues; set { _fullScaleValues = value; OnPropertyChanged("FullScaleValues"); } }
private double _selectedFullScaleValue = 100;
public double SelectedFullScaleValue { get => _selectedFullScaleValue; set { _selectedFullScaleValue = value; OnPropertyChanged("SelectedFullScaleValue"); } }
private bool _lockedT = false;
public bool LockedT { get => _lockedT; set { if (_lockedT.Equals(value)) return; _lockedT = value; OnPropertyChanged("LockedT"); } }
private bool _lockedY = false;
public bool LockedY { get => _lockedY; set { if (_lockedY.Equals(value)) return; _lockedY = value; OnPropertyChanged("LockedY"); } }
private bool _showCursor = false;
public bool ShowCursor
{
get => _showCursor;
set
{
if (_showCursor.Equals(value)) return;
_showCursor = value; Parent?.ShowCusor(_showCursor); OnPropertyChanged("ShowCursor");
}
}
private string _currentCursorValues = string.Empty;
public string CurrentCursorValues
{
get => _currentCursorValues;
set { _currentCursorValues = value; OnPropertyChanged("CurrentCursorValues"); }
}
private YRangeScaleEnum _yRange = YRangeScaleEnum.AutoRange;
public YRangeScaleEnum YRange
{
get => _yRange;
set { if (_yRange.Equals(value)) return; _yRange = value; LockedY = _yRange == YRangeScaleEnum.Fixed; OnPropertyChanged("YRange"); }
}
private FilterOptionEnum _filter = FilterOptionEnum.TestSetupDefault;
public FilterOptionEnum Filter { get => _filter; set { if (_filter.Equals(value)) return; _filter = value; ReadData = true; OnPropertyChanged("Filter"); } }
private IChartOptionsViewModel _parent;
public IChartOptionsViewModel Parent { get => _parent; set { if (_parent != null && _parent.Equals(value)) return; _parent = value; OnPropertyChanged("Parent"); } }
private bool _canPublishChanges = true;
public bool CanPublishChanges { get => _canPublishChanges; set { _canPublishChanges = value; OnPropertyChanged("CanPublishChanges"); } }
private bool _isCursorsAvailable = false;
public bool IsCursorsAvailable { get => _isCursorsAvailable; set { _isCursorsAvailable = value; OnPropertyChanged("IsCursorsAvailable"); } }
private bool _t0Cursor = false;
public bool T0Cursor { get => _t0Cursor; set { _t0Cursor = value; OnPropertyChanged("T0Cursor"); } }
private bool _minMaxCursors = false;
public bool MinMaxCursors { get => _minMaxCursors; set { _minMaxCursors = value; OnPropertyChanged("MinMaxCursors"); } }
private bool _readData = false;
public bool ReadData { get => _readData; set { _readData = value; OnPropertyChanged("ReadData"); } }
private DelegateCommand _resetZoomCommand;
public DelegateCommand ResetZoomCommand => _resetZoomCommand ?? (_resetZoomCommand = new DelegateCommand(ResetZoomMethod));
private void ResetZoomMethod()
{
Parent.ResetZoomMethod();
}
private DelegateCommand _resetTCommand;
public DelegateCommand ResetTCommand => _resetTCommand ?? (_resetTCommand = new DelegateCommand(ResetTMethod));
private void ResetTMethod()
{
Parent.ResetTMethod();
}
private DelegateCommand _saveToPDFCommand;
public DelegateCommand SaveToPDFCommand => _saveToPDFCommand ?? (_saveToPDFCommand = new DelegateCommand(SaveToPDFMethod));
private void SaveToPDFMethod()
{
Parent.SaveToPDFMethod();
}
///<summary>
///Occurs when a property value changes.
///</summary>
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
if (propertyName == "CanPublishChanges"
|| propertyName == "Parent"
|| propertyName == "ReadData"
|| propertyName == "UnitTypeDescription"
|| propertyName == "ShowCursor"
|| propertyName == "LockedT"
|| propertyName == "LockedY"
|| propertyName == "MVOrV"
|| propertyName == "DisplayingVolts"
|| propertyName == "DecimateData"
|| propertyName == "WidthPoints") return;
if (CanPublishChanges) { Parent?.PublishChanges(); }
}
public bool IsSaved { get; }
private bool _decimateData = false;
public bool DecimateData { get => _unitType != ChartUnitTypeEnum.PSD && _unitType != ChartUnitTypeEnum.FFT && _decimateData; set { _decimateData = value; OnPropertyChanged("DecimateData"); } }
private long _widthPoints = 0;
public long WidthPoints { get => _widthPoints; set { _widthPoints = value; OnPropertyChanged("WidthPoints"); } }
#endregion Properties
}
}

View File

@@ -0,0 +1,83 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="CheckRadioFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="14,0,0,0" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="SliderCheckBox" TargetType="{x:Type CheckBox}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<ControlTemplate.Resources>
<Storyboard x:Key="StoryboardIsChecked">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="CheckFlag">
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="14"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="StoryboardIsCheckedOff">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="CheckFlag">
<EasingDoubleKeyFrame KeyTime="0" Value="14"/>
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<BulletDecorator Background="Transparent" SnapsToDevicePixels="true">
<BulletDecorator.Bullet>
<Border x:Name="ForegroundPanel" BorderThickness="1" Width="35" Height="20" CornerRadius="10">
<Canvas>
<Border Background="White" x:Name="CheckFlag" CornerRadius="10" VerticalAlignment="Center" BorderThickness="1" Width="19" Height="18" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Border.RenderTransform>
<Border.Effect>
<DropShadowEffect ShadowDepth="1" Direction="180" />
</Border.Effect>
</Border>
</Canvas>
</Border>
</BulletDecorator.Bullet>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"/>
</BulletDecorator>
<ControlTemplate.Triggers>
<Trigger Property="HasContent" Value="true">
<Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/>
<Setter Property="Padding" Value="4,0,0,0"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="ForegroundPanel" Property="Background" Value="Lime" /> <!-- {DynamicResource Accent} -->
<Trigger.EnterActions>
<BeginStoryboard x:Name="BeginStoryboardCheckedTrue" Storyboard="{StaticResource StoryboardIsChecked}" />
<RemoveStoryboard BeginStoryboardName="BeginStoryboardCheckedFalse" />
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter TargetName="ForegroundPanel" Property="Background" Value="Green" />
<Trigger.EnterActions>
<BeginStoryboard x:Name="BeginStoryboardCheckedFalse" Storyboard="{StaticResource StoryboardIsCheckedOff}" />
<RemoveStoryboard BeginStoryboardName="BeginStoryboardCheckedTrue" />
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ChartUnitType" xml:space="preserve">
<value>Y軸の表示方法</value>
</data>
<data name="FilterOptions_Title" xml:space="preserve">
<value>表示用ソフトウエアフィルター</value>
</data>
<data name="LockT" xml:space="preserve">
<value>時間軸固定</value>
</data>
<data name="Range" xml:space="preserve">
<value>レンジ設定</value>
</data>
<data name="ResetAll" xml:space="preserve">
<value>全リセット</value>
</data>
<data name="ResetT" xml:space="preserve">
<value>時間軸リセット</value>
</data>
<data name="TimeUnitType" xml:space="preserve">
<value>時間の単位</value>
</data>
</root>

View File

@@ -0,0 +1,164 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:common="clr-namespace:DTS.Common;assembly=DTS.Common">
<Style TargetType="Label">
<!--<Setter Property="HorizontalAlignment" Value="Right"/>
<Setter Property="HorizontalContentAlignment" Value="Right"/>-->
<Setter Property="Width" Value="100"/>
</Style>
<Style TargetType="StackPanel">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
</Style>
<Style TargetType="{x:Type RadioButton}" >
<Setter Property="Width" Value="100"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RadioButton}">
<BulletDecorator Background="White" Cursor="Hand">
<BulletDecorator.Bullet>
<Grid Height="16" Width="16">
<!--Define size of the Bullet-->
<!--The two borders-->
<Border Name="RadioOuter" Background="Transparent" BorderBrush="Gainsboro" BorderThickness="2" CornerRadius="2" />
<Border CornerRadius="0" Margin="4" Name="RadioMark" Background="#FFADADAD" Visibility="Hidden" />
</Grid>
</BulletDecorator.Bullet>
<!--Text element-->
<TextBlock Margin="3,1,0,0" Foreground="#FF3E3E3E" FontFamily="Calibri" FontSize="12">
<ContentPresenter />
</TextBlock>
</BulletDecorator>
<!--If item is checked, trigger the visibility of the mark-->
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<!--If item is checked, trigger the visibility of the mark and change the color of the selected bullet into a darker gray for better highlighting-->
<Setter TargetName="RadioMark" Property="Visibility" Value="Visible"/>
<Setter TargetName="RadioOuter" Property="BorderBrush" Value="#FFADADAD" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="ButtonFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Border>
<!--<Rectangle SnapsToDevicePixels="true" Margin="4" Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1"/>-->
<Rectangle Margin="2" StrokeThickness="1" Stroke="LightGray" StrokeDashArray="1 2" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="RoundedButton" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderThickness" Value="3"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="0,0,1,1"/>
<Setter Property="Height" Value="25"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<ControlTemplate.Resources>
<Storyboard x:Key="ShowShine">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Shine" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="HideShine">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Shine" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<Border CornerRadius="5,5,5,5" BorderThickness="1,1,1,1" RenderTransformOrigin="0.5,0.5" x:Name="border" BorderBrush="Silver">
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Border.RenderTransform>
<Border Background="{TemplateBinding Background}" CornerRadius="5,5,5,5" x:Name="border1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"/>
<RowDefinition Height="0.5*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" CornerRadius="5,5,0,0">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#00FFFFFF" Offset="0"/>
<GradientStop Color="#7EFFFFFF" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
</Border>
<Border Grid.Row="1" Opacity="0" x:Name="Shine" Width="Auto" Height="Auto" CornerRadius="0,0,5,5" Margin="1,0,-1,0" Background="{TemplateBinding BorderBrush}"/>
<ContentPresenter VerticalAlignment="Center" Grid.Row="0" Grid.RowSpan="2" HorizontalAlignment="Center" x:Name="contentPresenter"/>
</Grid>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" TargetName="border1" Value="0.5"/>
<Setter Property="Opacity" TargetName="border" Value="1"/>
<Setter Property="Opacity" TargetName="contentPresenter" Value="0.5"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="RenderTransform" TargetName="border">
<Setter.Value>
<TransformGroup>
<ScaleTransform ScaleX="0.9" ScaleY="0.9"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource HideShine}" x:Name="HideShine_BeginStoryboard"/>
</Trigger.ExitActions>
<Trigger.EnterActions>
<BeginStoryboard x:Name="ShowShine_BeginStoryboard" Storyboard="{StaticResource ShowShine}"/>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="FontFamily" Value="Calibri"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<ObjectDataProvider x:Key="CfcFilterData" MethodName="GetValues" ObjectType="{x:Type system:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="common:CFCFilter"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</ResourceDictionary>

View File

@@ -0,0 +1,221 @@
<base:BaseView x:Class="DTS.Viewer.ChartOptions.ChartOptionsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:base="clr-namespace:DTS.Common.Base;assembly=DTS.Common"
xmlns:converters="clr-namespace:DTS.Common.Converters;assembly=DTS.Common"
xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"
xmlns:viewer="clr-namespace:DTS.Common.Enums.Viewer;assembly=DTS.Common"
xmlns:strings="clr-namespace:DTS.Viewer.ChartOptions"
VerticalAlignment="Top" HorizontalAlignment="Right" x:Name="chartViewOptions">
<base:BaseView.Resources>
<ResourceDictionary>
<converters:InverseBooleanToOpacityConverter x:Key="InverseBooleanToOpacityConverter" />
<converters:BooleanToOpacityConverter x:Key="BooleanToOpacityConverter" />
<converters:EnumBooleanConverter x:Key="EnumBooleanConverter" />
<converters:InverseBooleanConverter x:Key="InverseBooleanConverter" />
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<converters:InverseBooleanToVisibilityConverter x:Key="InverseBooleanToVisibilityConverter" />
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/ChartOptionsResources.xaml"/>
<ResourceDictionary Source="../Resources/CheckBoxSlider.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</base:BaseView.Resources>
<StackPanel Orientation="Vertical" Width="300" Height="500" VerticalAlignment="Top" HorizontalAlignment="Right"
IsEnabled="{Binding Path=ChartOptionsVisability, Mode=TwoWay}"
Opacity="{Binding Path=ChartOptionsVisability, Converter={StaticResource InverseBooleanToOpacityConverter}, Mode=TwoWay}">
<GroupBox Header="{strings:TranslateExtension ChartUnitType}" Margin="5,0,5,0" AutomationProperties.AutomationId="ChartUnitTypeGrpBx">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<RadioButton GroupName="UnitTypeGroup" Content="{x:Static viewer:ChartUnitTypeEnum.EU}" Margin="0,5,0,5" Width="50" IsChecked="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.EU}}" AutomationProperties.AutomationId="EURdoBtn"/>
<!-- Content="{x:Static viewer:ChartUnitTypeEnum.mV}" -->
<RadioButton GroupName="UnitTypeGroup" Content="{Binding Path=Model.MVOrV}" Margin="10,5,0,5" Width="50" IsChecked="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.mV}}"
AutomationProperties.AutomationId="mVRdoBtn" IsEnabled="{Binding Path=Model.SupportsMV}" />
<RadioButton GroupName="UnitTypeGroup" Content="{x:Static viewer:ChartUnitTypeEnum.ADC}" Margin="10,5,0,5" Width="50" IsChecked="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.ADC}}"
AutomationProperties.AutomationId="ADCRdoBtn" IsEnabled="{Binding Path=Model.SupportsADC}" />
<RadioButton GroupName="UnitTypeGroup" Content="{x:Static viewer:ChartUnitTypeEnum.FFT}" Margin="10,5,0,5" Width="50" IsChecked="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}"
AutomationProperties.AutomationId="FFTdoBtn" />
</StackPanel>
</GroupBox>
<GroupBox Header="{strings:TranslateExtension Range}" Margin="5" AutomationProperties.AutomationId="RangeGrpBx">
<StackPanel Orientation="Vertical" HorizontalAlignment="Left">
<Grid Margin="10,10,0,0">
<RadioButton GroupName="Yaxis" Margin="0,5,0,5" Content="{Binding Path= Model.UnitTypeDescription, Mode=OneWay}" ContentStringFormat="Auto Range {0}" HorizontalAlignment="Left"
IsChecked="{Binding Path=Model.YRange, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:YRangeScaleEnum.AutoRange}}"
AutomationProperties.AutomationId="AutoRangeRdoBtn">
<RadioButton.Style>
<Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type RadioButton}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
</RadioButton>
<Button Content="{strings:TranslateExtension ResetAll}" Margin="0,0,10,0" Command="{Binding Path=Model.ResetZoomCommand}" HorizontalAlignment="Right" AutomationProperties.AutomationId="ResetAllBtn" />
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="10,2,0,0">
<StackPanel.Style>
<Style TargetType="StackPanel" BasedOn="{StaticResource {x:Type StackPanel}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<RadioButton x:Name="RadioButtonFullScale" GroupName="Yaxis" Margin="0,5,0,5" Content="{Binding Path= Model.UnitTypeDescription, Mode=OneWay}" ContentStringFormat="% Full Scale {0}"
IsChecked="{Binding Path=Model.YRange, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:YRangeScaleEnum.FullScale}}"
AutomationProperties.AutomationId="PerFullScaleRdoBtn"/>
<ComboBox ItemsSource="{Binding Path=Model.FullScaleValues, Mode=TwoWay}"
IsEnabled="{Binding ElementName=RadioButtonFullScale, Path=IsChecked, Mode=TwoWay}"
SelectedItem="{Binding Path=Model.SelectedFullScaleValue, Mode=TwoWay}"
Opacity="{Binding ElementName=RadioButtonFullScale, Path=IsChecked, Mode=TwoWay, Converter={StaticResource InverseBooleanToOpacityConverter}}"
HorizontalAlignment="Center" VerticalAlignment="Center" Margin="60,0,0,0" Width="90" AutomationProperties.AutomationId="PerFullScaleCboBx"/>
</StackPanel>
<StackPanel Orientation="Vertical" HorizontalAlignment="Left" Margin="10,2,0,0">
<StackPanel.Style>
<Style TargetType="StackPanel" BasedOn="{StaticResource {x:Type StackPanel}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<RadioButton x:Name="RadioButtonFixed" GroupName="Yaxis" Margin="0,5,0,5" HorizontalAlignment="Left" Content="{Binding Path= Model.UnitTypeDescription, Mode=OneWay}" ContentStringFormat="Fixed {0}"
IsChecked="{Binding Path=Model.YRange, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:YRangeScaleEnum.Fixed}, Mode=TwoWay}"
AutomationProperties.AutomationId="FixedRdoBtn"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="10,0,0,0"
IsEnabled="{Binding ElementName=RadioButtonFixed, Path=IsChecked}"
Opacity="{Binding ElementName=RadioButtonFixed, Path=IsChecked, Converter={StaticResource InverseBooleanToOpacityConverter}, Mode=TwoWay}">
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
<TextBlock Text="{strings:TranslateExtension MinY}" VerticalAlignment="Center" />
<c1:C1NumericBox Format="N3" VerticalAlignment="Center" Margin="5" Width="90" Value="{Binding Path=Model.MinFixedY, Mode=TwoWay}" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="10,0,0,0">
<TextBlock Text="{strings:TranslateExtension MaxY}" VerticalAlignment="Center" />
<c1:C1NumericBox Format="N3" VerticalAlignment="Center" Margin="5" Width="90" Value="{Binding Path=Model.MaxFixedY, Mode=TwoWay}"/>
</StackPanel>
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical" HorizontalAlignment="Left">
<StackPanel.Style>
<Style TargetType="StackPanel" BasedOn="{StaticResource {x:Type StackPanel}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<Grid>
<CheckBox x:Name="CheckBoxLockT" Content="{strings:TranslateExtension LockT}" Margin="10,10,0,0" IsChecked="{Binding Path=Model.LockedT, Mode=TwoWay}" HorizontalAlignment="Left" />
<Button Content="{strings:TranslateExtension ResetT}" Margin="0,0,10,0" Command="{Binding Path=Model.ResetTCommand}" HorizontalAlignment="Right" AutomationProperties.AutomationId="ResetTBtn"/>
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="10,0,0,0" >
<StackPanel Orientation="Horizontal" Margin="10,0,0,0" >
<TextBlock Text="{strings:TranslateExtension MinT}" VerticalAlignment="Center" />
<c1:C1NumericBox Format="N3" VerticalAlignment="Center" Margin="5" Width="90" Value="{Binding Path=Model.MinFixedT, Mode=TwoWay}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="20,0,0,0">
<TextBlock Text="{strings:TranslateExtension MaxT}" VerticalAlignment="Center" />
<c1:C1NumericBox Format="N3" VerticalAlignment="Center" Margin="5" Width="90" Value="{Binding Path=Model.MaxFixedT, Mode=TwoWay}"/>
</StackPanel>
</StackPanel>
</StackPanel>
</StackPanel>
</GroupBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" >
<StackPanel.Style>
<Style TargetType="StackPanel" BasedOn="{StaticResource {x:Type StackPanel}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<GroupBox Header="{strings:TranslateExtension FilterOptions_Title}" Margin="5,0,5,0" Width="130" AutomationProperties.AutomationId="FilterGrpBx">
<GroupBox.Style>
<Style TargetType="GroupBox" BasedOn="{StaticResource {x:Type GroupBox}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.EU}}" Value="False">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Model.IsDigitalChannel, Mode=TwoWay}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</GroupBox.Style>
<StackPanel Orientation="Vertical" >
<RadioButton Width="110" GroupName="FilterGroup" Margin="0,5,0,0" Content="{x:Static viewer:FilterOptionEnum.Unfiltered}" IsChecked="{Binding Path=Model.Filter, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:FilterOptionEnum.Unfiltered}}" AutomationProperties.AutomationId="UnfRdoBtn"/>
<RadioButton Width="110" GroupName="FilterGroup" Margin="0,5,0,0" Content="{x:Static viewer:FilterOptionEnum.TestSetupDefault}" IsChecked="{Binding Path=Model.Filter, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:FilterOptionEnum.TestSetupDefault}}" AutomationProperties.AutomationId="TestSetupDefRdoBtn"/>
<RadioButton Width="110" GroupName="FilterGroup" Margin="0,5,0,0" Content="{x:Static viewer:FilterOptionEnum.Custom}" x:Name="RbCustom" IsChecked="{Binding Path=Model.Filter, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:FilterOptionEnum.Custom}}"/>
<ComboBox DisplayMemberPath="FilterName" ItemsSource="{Binding ElementName=chartViewOptions, Path=AvailableCFC}" SelectedItem="{Binding Path=Model.SelectedFilter, Mode=TwoWay}"
IsEnabled="{Binding ElementName=RbCustom, Path=IsChecked, Mode=TwoWay}"
Opacity="{Binding ElementName=RbCustom, Path=IsChecked, Converter={StaticResource InverseBooleanToOpacityConverter}}"
AutomationProperties.AutomationId="CustomFilterCboBx"
HorizontalAlignment="Center"
Width="110"
Height="17"
VerticalAlignment="Center"
Margin="5" />
</StackPanel>
</GroupBox>
<GroupBox Header="{strings:TranslateExtension TimeUnitType}" Margin="5,0,5,0" Width="130" AutomationProperties.AutomationId="TimeUnitGrpBx">
<StackPanel Orientation="Vertical" HorizontalAlignment="Center">
<RadioButton GroupName="TimeUnitGroup" Content="{x:Static viewer:TimeUnitTypeEnum.MS}" Margin="0,5,0,5" Width="110" IsChecked="{Binding Path=Model.TimeUnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:TimeUnitTypeEnum.MS}}" AutomationProperties.AutomationId="msRdoBtn"/>
<RadioButton GroupName="TimeUnitGroup" Content="{x:Static viewer:TimeUnitTypeEnum.Seconds}" Margin="0,5,0,5" Width="110" IsChecked="{Binding Path=Model.TimeUnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:TimeUnitTypeEnum.Seconds}}" AutomationProperties.AutomationId="secRdoBtn"/>
</StackPanel>
</GroupBox>
</StackPanel>
<GroupBox Header="{strings:TranslateExtension SaveChart}" Margin="5" HorizontalAlignment="Left" AutomationProperties.AutomationId="SaveBx">
<StackPanel Orientation="Vertical" HorizontalAlignment="Left">
<Button Content="{strings:TranslateExtension SaveToPDF}" Margin="10" Padding="10, 5" Command="{Binding Path=Model.SaveToPDFCommand}" AutomationProperties.AutomationId="SaveToPDFBtn" />
</StackPanel>
</GroupBox>
</StackPanel>
</base:BaseView>

View File

@@ -0,0 +1,244 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using DTS.Common.Base;
using Unity;
using DTS.Common.Enums.Viewer;
using DTS.Common.Events;
using DTS.Common.Interface;
using Prism.Events;
using Prism.Regions;
using DTS.Common.Interactivity;
using Prism.Commands;
// ReSharper disable UnassignedGetOnlyAutoProperty
// ReSharper disable InconsistentNaming
// ReSharper disable NotAccessedField.Local
// ReSharper disable UnusedAutoPropertyAccessor.Local
// ReSharper disable CheckNamespace
// ReSharper disable AutoPropertyCanBeMadeGetOnly.Local
// ReSharper disable RedundantDefaultMemberInitializer
namespace DTS.Viewer.ChartOptions
{
public class ChartOptionsViewModel : BaseViewModel<IChartOptionsViewModel>, IChartOptionsViewModel
{
public IBaseViewModel Parent { get; set; }
private IEventAggregator _eventAggregator { get; set; }
private IUnityContainer _unityContainer { get; set; }
public InteractionRequest<Notification> NotificationRequest { get; private set; }
public new InteractionRequest<Confirmation> ConfirmationRequest { get; private set; }
public IBaseView View { get; set; }
private IChartOptionsModel _model;
public new IChartOptionsModel Model { get => _model; set { _model = value; OnPropertyChanged("Model"); } }
/// <summary>
/// Creates a new instance of the TestSummaryViewModel.
/// </summary>
/// <param name="view">The TestListView interface.</param>
/// <param name="regionManager">The logical placeholder defined within the application's UI (in the shell or within views) into which views are displayed.</param>
/// <param name="eventAggregator">The EventAggregator which allows different components to publish/subscribe to events without being coupled to each other.</param>
/// <param name="unityContainer">The unityContainer.</param>
public ChartOptionsViewModel(IChartOptionsView view, IRegionManager regionManager, IEventAggregator eventAggregator, IUnityContainer unityContainer)
: base(regionManager, eventAggregator, unityContainer)
{
View = view;
View.DataContext = this;
NotificationRequest = new InteractionRequest<Notification>();
ConfirmationRequest = new InteractionRequest<Confirmation>();
_eventAggregator = eventAggregator;
_unityContainer = unityContainer;
_eventAggregator.GetEvent<ChartAxisChangedEvent>().Subscribe(OnChartAxisChangedEvent);
//Model = _unityContainer.Resolve<IChartOptionsModel>();
//Model.Parent = this;
//View.DataContext = Model;
}
public override void Initialize()
{
}
private string chartType = string.Empty;
public override void Initialize(object parameter)
{
Subscribe();
Model = _unityContainer.Resolve<IChartOptionsModel>();
Model.Parent = this;
View.DataContext = Model;
if (parameter is IViewerMainViewModel)
{
Parent = (IBaseViewModel)parameter;
Model.DecimateData = true;
}
else if (parameter is Tuple<IBaseViewModel, string> tuParam && tuParam.Item1 is IPSDReportMainViewModel)
{
Parent = tuParam.Item1;
chartType = tuParam.Item2;
Model.CanPublishChanges = false;
if ("Graph" == chartType)
{
Model.UnitType = ChartUnitTypeEnum.PSD;
Model.YRange = YRangeScaleEnum.Fixed;
Model.MaxFixedY = 1;
Model.MinFixedY = 1e-12; //log scale, can't be 0
Model.DecimateData = false;
}
else
{
Model.DecimateData = true;
Model.Filter = FilterOptionEnum.Unfiltered;
}
Model.CanPublishChanges = true;
}
}
private void Subscribe()
{
_eventAggregator.GetEvent<CursorsAlailableChangedEvent>().Subscribe(OnCursorsAlailableChanged);
_eventAggregator.GetEvent<GraphSelectedChannelsNotification>().Subscribe(OnGraphSelectedChannelsChanged);
}
private string Directory { get; set; }
private void OnGraphSelectedChannelsChanged(GraphSelectedChannelsNotificationArg arg)
{
if (Parent != arg?.ParentVM) return;
var channels = arg.SelectedChannels;
Model.Parent = this;
Directory = channels.Count > 0 ? channels[0].BinaryFilePath : string.Empty;
ChartOptionsVisability = (channels.Count > 0);
//whenever channels change, check the status of mV/ADC buttons
//18256 Implement StackChannelScaleFactorsEUPerADC Arm/Event Command
if (AllChannelsSupportADC(channels))
{
Model.SupportsADC = true;
}
else
{
Model.SupportsADC = false;
if (Model.UnitType == ChartUnitTypeEnum.ADC)
{
Model.UnitType = ChartUnitTypeEnum.EU;
}
}
if (AllChannelsSupportmV(channels))
{
Model.SupportsMV = true;
}
else
{
Model.SupportsMV = false;
if (Model.UnitType == ChartUnitTypeEnum.mV)
{
Model.UnitType = ChartUnitTypeEnum.EU;
}
}
PublishChanges();
}
/// <summary>
/// returns true if all channels support ADC
/// for now this is determined by looking at the sensor serial number, but we
/// can be more sophisticated in the future, as there are other channels that won't support ADC meaningfully as well
/// (like calculated channels)
/// </summary>
private bool AllChannelsSupportADC(List<ITestChannel> channels)
{
return !channels.Exists(x => Common.Enums.Hardware.HardwareConstants.IsTSRAIRSerialNumber(x.ParentModule.BaseSerialNumber));
}
/// <summary>
/// returns true if all channels support mV
/// </summary>
private bool AllChannelsSupportmV(List<ITestChannel> channels)
{
return !channels.Exists(x => Common.Enums.Hardware.HardwareConstants.IsTSRAIRSerialNumber(x.ParentModule.BaseSerialNumber));
}
private void OnCursorsAlailableChanged(bool value)
{
Model.IsCursorsAvailable = value;
}
private void OnChartAxisChangedEvent(ChartAxisChangedEventArg args)
{
if (args?.ParentVM != Parent) return;
Model.CanPublishChanges = false;
switch (args.Axis)
{
case "Y":
Model.MinFixedY = args.MinValue;
Model.MaxFixedY = args.MaxValue;
break;
case "X":
Model.MinFixedT = args.MinValue;
Model.MaxFixedT = args.MaxValue;
break;
}
Model.CanPublishChanges = true;
}
#region Properties
public object ContextSearchRegion { get; set; }
public new bool IsMenuIncluded { get; set; }
public new bool IsNavigationIncluded { get; set; }
public new bool IsBusy { get; set; }
public new bool IsDirty { get; }
private bool _chartOptionsVisability = false;
public bool ChartOptionsVisability { get => _chartOptionsVisability; set { _chartOptionsVisability = value; OnPropertyChanged("ChartOptionsVisability"); } }
public new event PropertyChangedEventHandler PropertyChanged;
public new void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion Properties
#region Methods
public void ShowMinMaxCursor(bool value)
{
_eventAggregator.GetEvent<CursorShowMinMaxChangedEvent>().Publish(value);
}
public void ResetZoomMethod()
{
Model.YRange = YRangeScaleEnum.AutoRange;
_eventAggregator.GetEvent<ResetZoomChangedEvent>().Publish(true);
}
public void ResetTMethod()
{
_eventAggregator.GetEvent<ResetZoomChangedEvent>().Publish(false);
}
public void SaveToPDFMethod()
{
_eventAggregator.GetEvent<SaveToPDFRequestedEvent>().Publish(Directory);
}
public void PublishChanges()
{
_eventAggregator.GetEvent<ChartOptionsChangedEvent>().Publish(new ChartOptionsChangedEventArg() { ParentVM = Parent, Model = Model, ChartType = chartType });
}
public void ShowCusor(bool value)
{
_eventAggregator.GetEvent<CursorShowChangedEvent>().Publish(value);
}
#endregion Methods
#region Commands
private DelegateCommand _clearMarkersCommand;
public DelegateCommand ClearMarkersCommand => _clearMarkersCommand ?? (_clearMarkersCommand = new DelegateCommand(ClearMarkersMethod));
private void ClearMarkersMethod()
{
_eventAggregator.GetEvent<CursorsClearChangedEvent>().Publish(true);
}
#endregion
}
}

View File

@@ -0,0 +1,29 @@
using DTS.Common.Interface;
using DTS.Common.Interface.Sensors.SoftwareFilters;
using DTS.SensorDB;
using System.Collections.Generic;
namespace DTS.Viewer.ChartOptions
{
/// <summary>
/// Interaction logic for ChartOptionsView.xaml
/// </summary>
public partial class ChartOptionsView : IChartOptionsView
{
public ChartOptionsView()
{
InitializeComponent();
}
/// <summary>
/// FB 13120 Available filter classes
/// </summary>
public List<IFilterClass> AvailableCFC
{
get
{
return new AnalogSettingDefaults().FilterOptions;
}
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("DTS.Viewer.DTS.Viewer.ChartOptions")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DTS.Viewer.DTS.Viewer.ChartOptions")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("9f161f2a-4fcd-438e-9768-ba96ba104d6c")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,140 @@
using System;
using System.Windows.Media.Imaging;
using DTS.Common;
using DTS.Common.Interface;
using DTS.Viewer.ChartOptions;
using DTS.Viewer.ChartOptions.Model;
using Prism.Ioc;
using Prism.Modularity;
using Unity;
// ReSharper disable RedundantAttributeUsageProperty
// ReSharper disable UnusedParameter.Local
[assembly: ChartOptionsModuleName()]
[assembly: ChartOptionsModuleImageAttribute()]
namespace DTS.Viewer.ChartOptions
{
[Module(ModuleName = "DTS.Viewer.ChartOptions")]
public class ChartOptionsModule : IModule
{
/// <summary>
/// Injected unity container
/// </summary>
private readonly IUnityContainer _unityContainer;
/// <summary>
/// Initializes a new instance of the <see cref="ChartOptionsModule"/> class.
/// </summary>
/// <param name="unityContainer">Obtained reference of the unity container by using dependency injection.</param>
public ChartOptionsModule(IUnityContainer unityContainer)
{
_unityContainer = unityContainer;
}
public void Initialize()
{
// Register View & View-Model with Unity dependency injection container as a singleton.
_unityContainer.RegisterType<IChartOptionsView, ChartOptionsView>();
_unityContainer.RegisterType<IChartOptionsViewModel, ChartOptionsViewModel>();
_unityContainer.RegisterType<IChartOptionsModel, ChartOptionsModel>();
}
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
Initialize();
}
}
/// <summary>
/// Attribute class contains assembly name
/// </summary>
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
public class ChartOptionsModuleNameAttribute : TextAttribute
{
public ChartOptionsModuleNameAttribute() : this(null) { }
public ChartOptionsModuleNameAttribute(string s)
{
AssemblyName = AssemblyNames.ChartOptions.ToString();
}
public override string AssemblyName { get; }
public override Type GetAttributeType()
{
return typeof(TextAttribute);
}
public override string GetAssemblyName()
{
return AssemblyName;
}
}
/// <summary>
/// Attribute class contains assembly image and name - used on the Main screen to ChartOptions available components
/// </summary>
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
public class ChartOptionsModuleImageAttribute : ImageAttribute
{
private BitmapImage _img;
public ChartOptionsModuleImageAttribute() : this(null) { }
public override BitmapImage AssemblyImage
{
get { _img = AssemblyInfo.GetImage(AssemblyNames.ChartOptions.ToString()); return _img; }
}
public ChartOptionsModuleImageAttribute(string s)
{
_img = AssemblyInfo.GetImage(AssemblyNames.ChartOptions.ToString());
}
public override Type GetAttributeType()
{
return typeof(ImageAttribute);
}
public override BitmapImage GetAssemblyImage()
{
return AssemblyImage;
}
private string _name;
public override string AssemblyName
{
get { _name = AssemblyNames.ChartOptions.ToString(); return _name; }
}
public override string GetAssemblyName()
{
return AssemblyName;
}
private string _group;
public override string AssemblyGroup
{
get { _group = eAssemblyGroups.Viewer.ToString(); return _group; }
}
public override string GetAssemblyGroup()
{
return AssemblyGroup;
}
private eAssemblyRegion _region;
public override eAssemblyRegion AssemblyRegion
{
get { _region = eAssemblyRegion.ChartOptionsRegion; return _region; }
}
public override eAssemblyRegion GetAssemblyRegion()
{
return AssemblyRegion;
}
}
}

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9F161F2A-4FCD-438E-9768-BA96BA104D6C}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DTS.Viewer.ChartOptions</RootNamespace>
<AssemblyName>DTS.Viewer.ChartOptions</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SccProjectName>
</SccProjectName>
<SccLocalPath>
</SccLocalPath>
<SccAuxPath>
</SccAuxPath>
<SccProvider>
</SccProvider>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="C1.WPF.4, Version=4.0.20163.541, Culture=neutral, PublicKeyToken=2aa4ec5576d6c3ce, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\Program Files (x86)\ComponentOne\WPF Edition\bin\v4\C1.WPF.4.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Practices.ServiceLocation">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Microsoft.Practices.ServiceLocation.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Xaml.Behaviors">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Microsoft.Xaml.Behaviors.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="Prism">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Prism.dll</HintPath>
</Reference>
<Reference Include="Prism.Unity.Wpf">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Prism.Unity.Wpf.dll</HintPath>
</Reference>
<Reference Include="Prism.Wpf">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Prism.Wpf.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Windows" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="Unity.Abstractions">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Unity.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Unity.Container">
<HintPath>..\..\..\Common\DTS.Common\lib\PrismLibrary\Unity.Container.dll</HintPath>
</Reference>
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="ChartOptionsModule.cs" />
<Compile Include="Model\ChartOptionsModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Resources\StringResources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>StringResources.resx</DependentUpon>
</Compile>
<Compile Include="Resources\TranslateExtension.cs" />
<Compile Include="ViewModel\ChartOptionsViewModel.cs" />
<Compile Include="View\ChartOptionsView.xaml.cs">
<DependentUpon>ChartOptionsView.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Page Include="Resources\CheckBoxSlider.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Resources\ChartOptionsResources.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="View\ChartOptionsView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\StringResources.ja.resx" />
<EmbeddedResource Include="Resources\StringResources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>StringResources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Common\DTS.Common.Core\DTS.Common.Core.csproj">
<Project>{fab1f470-1574-4301-b56e-d3364aa93679}</Project>
<Name>DTS.Common.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Common\DTS.Common\DTS.Common.csproj">
<Project>{114edc77-f3b5-4576-a91b-40818d503b55}</Project>
<Name>DTS.Common</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\DataPRO\SensorDB\SensorDB.csproj">
<Project>{444ef10c-046e-47ad-a9a5-17318d488723}</Project>
<Name>SensorDB</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,270 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using DTS.Common;
using DTS.Common.Classes.Sensors;
using DTS.Common.Enums.Viewer;
using DTS.Common.Interface;
using DTS.Common.Interface.Sensors.SoftwareFilters;
using Prism.Commands;
// ReSharper disable EmptyConstructor
// ReSharper disable RedundantDefaultMemberInitializer
// ReSharper disable UnassignedGetOnlyAutoProperty
namespace DTS.Viewer.ChartOptions.Model
{
public class ChartOptionsModel : Common.Base.BasePropertyChanged, IChartOptionsModel
{
private bool _bDisplayingVolts = false;
/// <summary>
/// indicates if current mV option is for Volts or mV
/// </summary>
public bool DisplayingVolts
{
get => _bDisplayingVolts;
set
{
SetProperty(ref _bDisplayingVolts, value, "DisplayingVolts");
OnPropertyChanged("MVOrV");
OnPropertyChanged("UnitTypeDescription");
}
}
/// <summary>
/// returns mV or V depending on DisplayingVolts value
/// </summary>
public string MVOrV => DisplayingVolts ? "V" : "mV";
public ChartOptionsModel()
{
}
#region Properties
private bool _isDigitalChannel = false;
public bool IsDigitalChannel { get { return _isDigitalChannel; } set { SetProperty(ref _isDigitalChannel, value, "IsDigitalChannel"); } }
private bool _supportsADC = true;
public bool SupportsADC
{
get => _supportsADC;
set
{
SetProperty(ref _supportsADC, value, "SupportsADC");
}
}
private bool _supportsMV = true;
public bool SupportsMV
{
get => _supportsMV;
set
{
SetProperty(ref _supportsMV, value, "SupportsMV");
}
}
private ChartUnitTypeEnum _unitType = ChartUnitTypeEnum.EU;
public ChartUnitTypeEnum UnitType
{
get => _unitType;
set
{
if (_unitType.Equals(value)) return;
_unitType = value;
ReadData = true;
// FB 13120 does not need to set SelectedFilter any more since it's not using enum
if (_unitType != ChartUnitTypeEnum.EU && _unitType != ChartUnitTypeEnum.PSD) { Filter = FilterOptionEnum.Unfiltered; }
else { Filter = FilterOptionEnum.TestSetupDefault; }
OnPropertyChanged("UnitType");
OnPropertyChanged("UnitTypeDescription");
}
}
private string _unitTypeDescription = ChartUnitTypeEnum.EU.ToString();
public string UnitTypeDescription
{
get
{
if (UnitType == ChartUnitTypeEnum.mV)
{
return DisplayingVolts ? "V" : "mV";
}
return UnitType.ToString();
}
}
private TimeUnitTypeEnum _timeUnitType = TimeUnitTypeEnum.MS;
public TimeUnitTypeEnum TimeUnitType
{
get => _timeUnitType;
set
{
if (_timeUnitType.Equals(value)) return;
_timeUnitType = value;
ReadData = true;
TimeUnitTypeDescription = _timeUnitType.ToString();
OnPropertyChanged("TimeUnitType");
}
}
private string _timeUnitTypeDescription = TimeUnitTypeEnum.MS.ToString();
public string TimeUnitTypeDescription
{
get => _timeUnitTypeDescription;
set
{
if (_timeUnitTypeDescription.Equals(value)) return;
_timeUnitTypeDescription = value;
OnPropertyChanged("TimeUnitTypeDescription");
}
}
//FB 13120 use filter class instead of cfc filter enum
private IFilterClass _selectedFilter = new FilterClass(Common.Enums.Sensors.FilterClassType.Unfiltered);
public IFilterClass SelectedFilter { get => _selectedFilter; set { _selectedFilter = value; ReadData = true; OnPropertyChanged("SelectedFilter"); } }
public void SetSelectedFilterToUnfilteredNoRead()
{
_selectedFilter = new FilterClass(Common.Enums.Sensors.FilterClassType.Unfiltered);
ReadData = false;
OnPropertyChanged("SelectedFilter");
}
#region Min/Max Fixed Y
private double _minFixedY = 0.00;
public double MinFixedY { get => _minFixedY; set { if (_minFixedY.Equals(value)) return; _minFixedY = value; OnPropertyChanged("MinFixedY"); } }
private double _maxFixedY = 0.00;
public double MaxFixedY { get => _maxFixedY; set { if (_maxFixedY.Equals(value)) return; _maxFixedY = value; OnPropertyChanged("MaxFixedY"); } }
#endregion Min/Max Fixed Y
#region Min/Max Fixed X
private double _minFixedT = 0.00;
public double MinFixedT { get => _minFixedT; set { if (_minFixedT.Equals(value)) return; _minFixedT = value; OnPropertyChanged("MinFixedT"); } }
private double _maxFixedT = 0.00;
public double MaxFixedT { get => _maxFixedT; set { if (_maxFixedT.Equals(value)) return; _maxFixedT = value; OnPropertyChanged("MaxFixedT"); } }
#endregion Min/Max Fixed X
private List<double> _fullScaleValues = new List<double> { 200D, 100D, 50D, 20D, 10D, 5D, 1D, 0.1D };
private readonly List<double> _euValues = new List<double> { 5000, 2500, 1000, 500, 100, 50, 10, 5 };
public List<double> FullScaleValues { get => UnitType == ChartUnitTypeEnum.EU || UnitType == ChartUnitTypeEnum.PSD ? _euValues : _fullScaleValues; set { _fullScaleValues = value; OnPropertyChanged("FullScaleValues"); } }
private double _selectedFullScaleValue = 100;
public double SelectedFullScaleValue { get => _selectedFullScaleValue; set { _selectedFullScaleValue = value; OnPropertyChanged("SelectedFullScaleValue"); } }
private bool _lockedT = false;
public bool LockedT { get => _lockedT; set { if (_lockedT.Equals(value)) return; _lockedT = value; OnPropertyChanged("LockedT"); } }
private bool _lockedY = false;
public bool LockedY { get => _lockedY; set { if (_lockedY.Equals(value)) return; _lockedY = value; OnPropertyChanged("LockedY"); } }
private bool _showCursor = false;
public bool ShowCursor
{
get => _showCursor;
set
{
if (_showCursor.Equals(value)) return;
_showCursor = value; Parent?.ShowCusor(_showCursor); OnPropertyChanged("ShowCursor");
}
}
private string _currentCursorValues = string.Empty;
public string CurrentCursorValues
{
get => _currentCursorValues;
set { _currentCursorValues = value; OnPropertyChanged("CurrentCursorValues"); }
}
private YRangeScaleEnum _yRange = YRangeScaleEnum.AutoRange;
public YRangeScaleEnum YRange
{
get => _yRange;
set { if (_yRange.Equals(value)) return; _yRange = value; LockedY = _yRange == YRangeScaleEnum.Fixed; OnPropertyChanged("YRange"); }
}
private FilterOptionEnum _filter = FilterOptionEnum.TestSetupDefault;
public FilterOptionEnum Filter { get => _filter; set { if (_filter.Equals(value)) return; _filter = value; ReadData = true; OnPropertyChanged("Filter"); } }
private IChartOptionsViewModel _parent;
public IChartOptionsViewModel Parent { get => _parent; set { if (_parent != null && _parent.Equals(value)) return; _parent = value; OnPropertyChanged("Parent"); } }
private bool _canPublishChanges = true;
public bool CanPublishChanges { get => _canPublishChanges; set { _canPublishChanges = value; OnPropertyChanged("CanPublishChanges"); } }
private bool _isCursorsAvailable = false;
public bool IsCursorsAvailable { get => _isCursorsAvailable; set { _isCursorsAvailable = value; OnPropertyChanged("IsCursorsAvailable"); } }
private bool _t0Cursor = false;
public bool T0Cursor { get => _t0Cursor; set { _t0Cursor = value; OnPropertyChanged("T0Cursor"); } }
private bool _minMaxCursors = false;
public bool MinMaxCursors { get => _minMaxCursors; set { _minMaxCursors = value; OnPropertyChanged("MinMaxCursors"); } }
private bool _readData = false;
public bool ReadData { get => _readData; set { _readData = value; OnPropertyChanged("ReadData"); } }
private DelegateCommand _resetZoomCommand;
public DelegateCommand ResetZoomCommand => _resetZoomCommand ?? (_resetZoomCommand = new DelegateCommand(ResetZoomMethod));
private void ResetZoomMethod()
{
Parent.ResetZoomMethod();
}
private DelegateCommand _resetTCommand;
public DelegateCommand ResetTCommand => _resetTCommand ?? (_resetTCommand = new DelegateCommand(ResetTMethod));
private void ResetTMethod()
{
Parent.ResetTMethod();
}
private DelegateCommand _saveToPDFCommand;
public DelegateCommand SaveToPDFCommand => _saveToPDFCommand ?? (_saveToPDFCommand = new DelegateCommand(SaveToPDFMethod));
private void SaveToPDFMethod()
{
Parent.SaveToPDFMethod();
}
///<summary>
///Occurs when a property value changes.
///</summary>
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
if (propertyName == "CanPublishChanges"
|| propertyName == "Parent"
|| propertyName == "ReadData"
|| propertyName == "UnitTypeDescription"
|| propertyName == "ShowCursor"
|| propertyName == "LockedT"
|| propertyName == "LockedY"
|| propertyName == "MVOrV"
|| propertyName == "DisplayingVolts"
|| propertyName == "DecimateData"
|| propertyName == "WidthPoints") return;
if (CanPublishChanges) { Parent?.PublishChanges(); }
}
public bool IsSaved { get; }
private bool _decimateData = false;
public bool DecimateData { get => _unitType != ChartUnitTypeEnum.PSD && _unitType != ChartUnitTypeEnum.FFT && _decimateData; set { _decimateData = value; OnPropertyChanged("DecimateData"); } }
private long _widthPoints = 0;
public long WidthPoints { get => _widthPoints; set { _widthPoints = value; OnPropertyChanged("WidthPoints"); } }
#endregion Properties
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("DTS.Viewer.DTS.Viewer.ChartOptions")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DTS.Viewer.DTS.Viewer.ChartOptions")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("9f161f2a-4fcd-438e-9768-ba96ba104d6c")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,164 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:common="clr-namespace:DTS.Common;assembly=DTS.Common">
<Style TargetType="Label">
<!--<Setter Property="HorizontalAlignment" Value="Right"/>
<Setter Property="HorizontalContentAlignment" Value="Right"/>-->
<Setter Property="Width" Value="100"/>
</Style>
<Style TargetType="StackPanel">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
</Style>
<Style TargetType="{x:Type RadioButton}" >
<Setter Property="Width" Value="100"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RadioButton}">
<BulletDecorator Background="White" Cursor="Hand">
<BulletDecorator.Bullet>
<Grid Height="16" Width="16">
<!--Define size of the Bullet-->
<!--The two borders-->
<Border Name="RadioOuter" Background="Transparent" BorderBrush="Gainsboro" BorderThickness="2" CornerRadius="2" />
<Border CornerRadius="0" Margin="4" Name="RadioMark" Background="#FFADADAD" Visibility="Hidden" />
</Grid>
</BulletDecorator.Bullet>
<!--Text element-->
<TextBlock Margin="3,1,0,0" Foreground="#FF3E3E3E" FontFamily="Calibri" FontSize="12">
<ContentPresenter />
</TextBlock>
</BulletDecorator>
<!--If item is checked, trigger the visibility of the mark-->
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<!--If item is checked, trigger the visibility of the mark and change the color of the selected bullet into a darker gray for better highlighting-->
<Setter TargetName="RadioMark" Property="Visibility" Value="Visible"/>
<Setter TargetName="RadioOuter" Property="BorderBrush" Value="#FFADADAD" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="ButtonFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Border>
<!--<Rectangle SnapsToDevicePixels="true" Margin="4" Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1"/>-->
<Rectangle Margin="2" StrokeThickness="1" Stroke="LightGray" StrokeDashArray="1 2" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="RoundedButton" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderThickness" Value="3"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="0,0,1,1"/>
<Setter Property="Height" Value="25"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<ControlTemplate.Resources>
<Storyboard x:Key="ShowShine">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Shine" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="HideShine">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Shine" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<Border CornerRadius="5,5,5,5" BorderThickness="1,1,1,1" RenderTransformOrigin="0.5,0.5" x:Name="border" BorderBrush="Silver">
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Border.RenderTransform>
<Border Background="{TemplateBinding Background}" CornerRadius="5,5,5,5" x:Name="border1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"/>
<RowDefinition Height="0.5*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" CornerRadius="5,5,0,0">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#00FFFFFF" Offset="0"/>
<GradientStop Color="#7EFFFFFF" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
</Border>
<Border Grid.Row="1" Opacity="0" x:Name="Shine" Width="Auto" Height="Auto" CornerRadius="0,0,5,5" Margin="1,0,-1,0" Background="{TemplateBinding BorderBrush}"/>
<ContentPresenter VerticalAlignment="Center" Grid.Row="0" Grid.RowSpan="2" HorizontalAlignment="Center" x:Name="contentPresenter"/>
</Grid>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" TargetName="border1" Value="0.5"/>
<Setter Property="Opacity" TargetName="border" Value="1"/>
<Setter Property="Opacity" TargetName="contentPresenter" Value="0.5"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="RenderTransform" TargetName="border">
<Setter.Value>
<TransformGroup>
<ScaleTransform ScaleX="0.9" ScaleY="0.9"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource HideShine}" x:Name="HideShine_BeginStoryboard"/>
</Trigger.ExitActions>
<Trigger.EnterActions>
<BeginStoryboard x:Name="ShowShine_BeginStoryboard" Storyboard="{StaticResource ShowShine}"/>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="FontFamily" Value="Calibri"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<ObjectDataProvider x:Key="CfcFilterData" MethodName="GetValues" ObjectType="{x:Type system:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="common:CFCFilter"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</ResourceDictionary>

View File

@@ -0,0 +1,83 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="CheckRadioFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="14,0,0,0" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="SliderCheckBox" TargetType="{x:Type CheckBox}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<ControlTemplate.Resources>
<Storyboard x:Key="StoryboardIsChecked">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="CheckFlag">
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="14"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="StoryboardIsCheckedOff">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="CheckFlag">
<EasingDoubleKeyFrame KeyTime="0" Value="14"/>
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<BulletDecorator Background="Transparent" SnapsToDevicePixels="true">
<BulletDecorator.Bullet>
<Border x:Name="ForegroundPanel" BorderThickness="1" Width="35" Height="20" CornerRadius="10">
<Canvas>
<Border Background="White" x:Name="CheckFlag" CornerRadius="10" VerticalAlignment="Center" BorderThickness="1" Width="19" Height="18" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Border.RenderTransform>
<Border.Effect>
<DropShadowEffect ShadowDepth="1" Direction="180" />
</Border.Effect>
</Border>
</Canvas>
</Border>
</BulletDecorator.Bullet>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"/>
</BulletDecorator>
<ControlTemplate.Triggers>
<Trigger Property="HasContent" Value="true">
<Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/>
<Setter Property="Padding" Value="4,0,0,0"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="ForegroundPanel" Property="Background" Value="Lime" /> <!-- {DynamicResource Accent} -->
<Trigger.EnterActions>
<BeginStoryboard x:Name="BeginStoryboardCheckedTrue" Storyboard="{StaticResource StoryboardIsChecked}" />
<RemoveStoryboard BeginStoryboardName="BeginStoryboardCheckedFalse" />
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter TargetName="ForegroundPanel" Property="Background" Value="Green" />
<Trigger.EnterActions>
<BeginStoryboard x:Name="BeginStoryboardCheckedFalse" Storyboard="{StaticResource StoryboardIsCheckedOff}" />
<RemoveStoryboard BeginStoryboardName="BeginStoryboardCheckedTrue" />
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,180 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace DTS.Viewer.ChartOptions.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class StringResources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal StringResources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DTS.Viewer.ChartOptions.Resources.StringResources", typeof(StringResources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Chart Unit Type.
/// </summary>
internal static string ChartUnitType {
get {
return ResourceManager.GetString("ChartUnitType", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Display Filter.
/// </summary>
internal static string FilterOptions_Title {
get {
return ResourceManager.GetString("FilterOptions_Title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lock T.
/// </summary>
internal static string LockT {
get {
return ResourceManager.GetString("LockT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Max:.
/// </summary>
internal static string MaxT {
get {
return ResourceManager.GetString("MaxT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Max:.
/// </summary>
internal static string MaxY {
get {
return ResourceManager.GetString("MaxY", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Min:.
/// </summary>
internal static string MinT {
get {
return ResourceManager.GetString("MinT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Min:.
/// </summary>
internal static string MinY {
get {
return ResourceManager.GetString("MinY", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Range.
/// </summary>
internal static string Range {
get {
return ResourceManager.GetString("Range", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reset All.
/// </summary>
internal static string ResetAll {
get {
return ResourceManager.GetString("ResetAll", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reset T.
/// </summary>
internal static string ResetT {
get {
return ResourceManager.GetString("ResetT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Save Chart.
/// </summary>
internal static string SaveChart {
get {
return ResourceManager.GetString("SaveChart", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Save to PDF.
/// </summary>
internal static string SaveToPDF {
get {
return ResourceManager.GetString("SaveToPDF", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Time Unit Type.
/// </summary>
internal static string TimeUnitType {
get {
return ResourceManager.GetString("TimeUnitType", resourceCulture);
}
}
}
}

View File

@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ChartUnitType" xml:space="preserve">
<value>Y軸の表示方法</value>
</data>
<data name="FilterOptions_Title" xml:space="preserve">
<value>表示用ソフトウエアフィルター</value>
</data>
<data name="LockT" xml:space="preserve">
<value>時間軸固定</value>
</data>
<data name="Range" xml:space="preserve">
<value>レンジ設定</value>
</data>
<data name="ResetAll" xml:space="preserve">
<value>全リセット</value>
</data>
<data name="ResetT" xml:space="preserve">
<value>時間軸リセット</value>
</data>
<data name="TimeUnitType" xml:space="preserve">
<value>時間の単位</value>
</data>
</root>

View File

@@ -0,0 +1,160 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ChartUnitType" xml:space="preserve">
<value>Chart Unit Type</value>
</data>
<data name="FilterOptions_Title" xml:space="preserve">
<value>Display Filter</value>
<comment>Title for Display Filter Options GroupBox</comment>
</data>
<data name="LockT" xml:space="preserve">
<value>Lock T</value>
</data>
<data name="MaxT" xml:space="preserve">
<value>Max:</value>
</data>
<data name="MaxY" xml:space="preserve">
<value>Max:</value>
</data>
<data name="MinT" xml:space="preserve">
<value>Min:</value>
</data>
<data name="MinY" xml:space="preserve">
<value>Min:</value>
</data>
<data name="Range" xml:space="preserve">
<value>Range</value>
</data>
<data name="ResetAll" xml:space="preserve">
<value>Reset All</value>
</data>
<data name="ResetT" xml:space="preserve">
<value>Reset T</value>
</data>
<data name="SaveChart" xml:space="preserve">
<value>Save Chart</value>
</data>
<data name="SaveToPDF" xml:space="preserve">
<value>Save to PDF</value>
</data>
<data name="TimeUnitType" xml:space="preserve">
<value>Time Unit Type</value>
</data>
</root>

View File

@@ -0,0 +1,21 @@
using System;
using System.Windows.Markup;
using DTS.Viewer.ChartOptions.Resources;
namespace DTS.Viewer.ChartOptions
{
[MarkupExtensionReturnType(typeof(string))]
public class TranslateExtension : MarkupExtension
{
private readonly string _key;
public TranslateExtension(string key) { _key = key; }
private const string NotFound = "#stringnotfound#";
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (string.IsNullOrEmpty(_key)) { return NotFound; }
return StringResources.ResourceManager.GetString(_key) ?? NotFound + " " + _key;
}
}
}

View File

@@ -0,0 +1,221 @@
<base:BaseView x:Class="DTS.Viewer.ChartOptions.ChartOptionsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:base="clr-namespace:DTS.Common.Base;assembly=DTS.Common"
xmlns:converters="clr-namespace:DTS.Common.Converters;assembly=DTS.Common"
xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"
xmlns:viewer="clr-namespace:DTS.Common.Enums.Viewer;assembly=DTS.Common"
xmlns:strings="clr-namespace:DTS.Viewer.ChartOptions"
VerticalAlignment="Top" HorizontalAlignment="Right" x:Name="chartViewOptions">
<base:BaseView.Resources>
<ResourceDictionary>
<converters:InverseBooleanToOpacityConverter x:Key="InverseBooleanToOpacityConverter" />
<converters:BooleanToOpacityConverter x:Key="BooleanToOpacityConverter" />
<converters:EnumBooleanConverter x:Key="EnumBooleanConverter" />
<converters:InverseBooleanConverter x:Key="InverseBooleanConverter" />
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<converters:InverseBooleanToVisibilityConverter x:Key="InverseBooleanToVisibilityConverter" />
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/ChartOptionsResources.xaml"/>
<ResourceDictionary Source="../Resources/CheckBoxSlider.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</base:BaseView.Resources>
<StackPanel Orientation="Vertical" Width="300" Height="500" VerticalAlignment="Top" HorizontalAlignment="Right"
IsEnabled="{Binding Path=ChartOptionsVisability, Mode=TwoWay}"
Opacity="{Binding Path=ChartOptionsVisability, Converter={StaticResource InverseBooleanToOpacityConverter}, Mode=TwoWay}">
<GroupBox Header="{strings:TranslateExtension ChartUnitType}" Margin="5,0,5,0" AutomationProperties.AutomationId="ChartUnitTypeGrpBx">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<RadioButton GroupName="UnitTypeGroup" Content="{x:Static viewer:ChartUnitTypeEnum.EU}" Margin="0,5,0,5" Width="50" IsChecked="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.EU}}" AutomationProperties.AutomationId="EURdoBtn"/>
<!-- Content="{x:Static viewer:ChartUnitTypeEnum.mV}" -->
<RadioButton GroupName="UnitTypeGroup" Content="{Binding Path=Model.MVOrV}" Margin="10,5,0,5" Width="50" IsChecked="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.mV}}"
AutomationProperties.AutomationId="mVRdoBtn" IsEnabled="{Binding Path=Model.SupportsMV}" />
<RadioButton GroupName="UnitTypeGroup" Content="{x:Static viewer:ChartUnitTypeEnum.ADC}" Margin="10,5,0,5" Width="50" IsChecked="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.ADC}}"
AutomationProperties.AutomationId="ADCRdoBtn" IsEnabled="{Binding Path=Model.SupportsADC}" />
<RadioButton GroupName="UnitTypeGroup" Content="{x:Static viewer:ChartUnitTypeEnum.FFT}" Margin="10,5,0,5" Width="50" IsChecked="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}"
AutomationProperties.AutomationId="FFTdoBtn" />
</StackPanel>
</GroupBox>
<GroupBox Header="{strings:TranslateExtension Range}" Margin="5" AutomationProperties.AutomationId="RangeGrpBx">
<StackPanel Orientation="Vertical" HorizontalAlignment="Left">
<Grid Margin="10,10,0,0">
<RadioButton GroupName="Yaxis" Margin="0,5,0,5" Content="{Binding Path= Model.UnitTypeDescription, Mode=OneWay}" ContentStringFormat="Auto Range {0}" HorizontalAlignment="Left"
IsChecked="{Binding Path=Model.YRange, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:YRangeScaleEnum.AutoRange}}"
AutomationProperties.AutomationId="AutoRangeRdoBtn">
<RadioButton.Style>
<Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type RadioButton}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
</RadioButton>
<Button Content="{strings:TranslateExtension ResetAll}" Margin="0,0,10,0" Command="{Binding Path=Model.ResetZoomCommand}" HorizontalAlignment="Right" AutomationProperties.AutomationId="ResetAllBtn" />
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="10,2,0,0">
<StackPanel.Style>
<Style TargetType="StackPanel" BasedOn="{StaticResource {x:Type StackPanel}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<RadioButton x:Name="RadioButtonFullScale" GroupName="Yaxis" Margin="0,5,0,5" Content="{Binding Path= Model.UnitTypeDescription, Mode=OneWay}" ContentStringFormat="% Full Scale {0}"
IsChecked="{Binding Path=Model.YRange, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:YRangeScaleEnum.FullScale}}"
AutomationProperties.AutomationId="PerFullScaleRdoBtn"/>
<ComboBox ItemsSource="{Binding Path=Model.FullScaleValues, Mode=TwoWay}"
IsEnabled="{Binding ElementName=RadioButtonFullScale, Path=IsChecked, Mode=TwoWay}"
SelectedItem="{Binding Path=Model.SelectedFullScaleValue, Mode=TwoWay}"
Opacity="{Binding ElementName=RadioButtonFullScale, Path=IsChecked, Mode=TwoWay, Converter={StaticResource InverseBooleanToOpacityConverter}}"
HorizontalAlignment="Center" VerticalAlignment="Center" Margin="60,0,0,0" Width="90" AutomationProperties.AutomationId="PerFullScaleCboBx"/>
</StackPanel>
<StackPanel Orientation="Vertical" HorizontalAlignment="Left" Margin="10,2,0,0">
<StackPanel.Style>
<Style TargetType="StackPanel" BasedOn="{StaticResource {x:Type StackPanel}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<RadioButton x:Name="RadioButtonFixed" GroupName="Yaxis" Margin="0,5,0,5" HorizontalAlignment="Left" Content="{Binding Path= Model.UnitTypeDescription, Mode=OneWay}" ContentStringFormat="Fixed {0}"
IsChecked="{Binding Path=Model.YRange, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:YRangeScaleEnum.Fixed}, Mode=TwoWay}"
AutomationProperties.AutomationId="FixedRdoBtn"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="10,0,0,0"
IsEnabled="{Binding ElementName=RadioButtonFixed, Path=IsChecked}"
Opacity="{Binding ElementName=RadioButtonFixed, Path=IsChecked, Converter={StaticResource InverseBooleanToOpacityConverter}, Mode=TwoWay}">
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
<TextBlock Text="{strings:TranslateExtension MinY}" VerticalAlignment="Center" />
<c1:C1NumericBox Format="N3" VerticalAlignment="Center" Margin="5" Width="90" Value="{Binding Path=Model.MinFixedY, Mode=TwoWay}" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="10,0,0,0">
<TextBlock Text="{strings:TranslateExtension MaxY}" VerticalAlignment="Center" />
<c1:C1NumericBox Format="N3" VerticalAlignment="Center" Margin="5" Width="90" Value="{Binding Path=Model.MaxFixedY, Mode=TwoWay}"/>
</StackPanel>
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical" HorizontalAlignment="Left">
<StackPanel.Style>
<Style TargetType="StackPanel" BasedOn="{StaticResource {x:Type StackPanel}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<Grid>
<CheckBox x:Name="CheckBoxLockT" Content="{strings:TranslateExtension LockT}" Margin="10,10,0,0" IsChecked="{Binding Path=Model.LockedT, Mode=TwoWay}" HorizontalAlignment="Left" />
<Button Content="{strings:TranslateExtension ResetT}" Margin="0,0,10,0" Command="{Binding Path=Model.ResetTCommand}" HorizontalAlignment="Right" AutomationProperties.AutomationId="ResetTBtn"/>
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="10,0,0,0" >
<StackPanel Orientation="Horizontal" Margin="10,0,0,0" >
<TextBlock Text="{strings:TranslateExtension MinT}" VerticalAlignment="Center" />
<c1:C1NumericBox Format="N3" VerticalAlignment="Center" Margin="5" Width="90" Value="{Binding Path=Model.MinFixedT, Mode=TwoWay}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="20,0,0,0">
<TextBlock Text="{strings:TranslateExtension MaxT}" VerticalAlignment="Center" />
<c1:C1NumericBox Format="N3" VerticalAlignment="Center" Margin="5" Width="90" Value="{Binding Path=Model.MaxFixedT, Mode=TwoWay}"/>
</StackPanel>
</StackPanel>
</StackPanel>
</StackPanel>
</GroupBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" >
<StackPanel.Style>
<Style TargetType="StackPanel" BasedOn="{StaticResource {x:Type StackPanel}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=OneWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.FFT}}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<GroupBox Header="{strings:TranslateExtension FilterOptions_Title}" Margin="5,0,5,0" Width="130" AutomationProperties.AutomationId="FilterGrpBx">
<GroupBox.Style>
<Style TargetType="GroupBox" BasedOn="{StaticResource {x:Type GroupBox}}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Model.UnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:ChartUnitTypeEnum.EU}}" Value="False">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Model.IsDigitalChannel, Mode=TwoWay}" Value="True">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</GroupBox.Style>
<StackPanel Orientation="Vertical" >
<RadioButton Width="110" GroupName="FilterGroup" Margin="0,5,0,0" Content="{x:Static viewer:FilterOptionEnum.Unfiltered}" IsChecked="{Binding Path=Model.Filter, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:FilterOptionEnum.Unfiltered}}" AutomationProperties.AutomationId="UnfRdoBtn"/>
<RadioButton Width="110" GroupName="FilterGroup" Margin="0,5,0,0" Content="{x:Static viewer:FilterOptionEnum.TestSetupDefault}" IsChecked="{Binding Path=Model.Filter, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:FilterOptionEnum.TestSetupDefault}}" AutomationProperties.AutomationId="TestSetupDefRdoBtn"/>
<RadioButton Width="110" GroupName="FilterGroup" Margin="0,5,0,0" Content="{x:Static viewer:FilterOptionEnum.Custom}" x:Name="RbCustom" IsChecked="{Binding Path=Model.Filter, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:FilterOptionEnum.Custom}}"/>
<ComboBox DisplayMemberPath="FilterName" ItemsSource="{Binding ElementName=chartViewOptions, Path=AvailableCFC}" SelectedItem="{Binding Path=Model.SelectedFilter, Mode=TwoWay}"
IsEnabled="{Binding ElementName=RbCustom, Path=IsChecked, Mode=TwoWay}"
Opacity="{Binding ElementName=RbCustom, Path=IsChecked, Converter={StaticResource InverseBooleanToOpacityConverter}}"
AutomationProperties.AutomationId="CustomFilterCboBx"
HorizontalAlignment="Center"
Width="110"
Height="17"
VerticalAlignment="Center"
Margin="5" />
</StackPanel>
</GroupBox>
<GroupBox Header="{strings:TranslateExtension TimeUnitType}" Margin="5,0,5,0" Width="130" AutomationProperties.AutomationId="TimeUnitGrpBx">
<StackPanel Orientation="Vertical" HorizontalAlignment="Center">
<RadioButton GroupName="TimeUnitGroup" Content="{x:Static viewer:TimeUnitTypeEnum.MS}" Margin="0,5,0,5" Width="110" IsChecked="{Binding Path=Model.TimeUnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:TimeUnitTypeEnum.MS}}" AutomationProperties.AutomationId="msRdoBtn"/>
<RadioButton GroupName="TimeUnitGroup" Content="{x:Static viewer:TimeUnitTypeEnum.Seconds}" Margin="0,5,0,5" Width="110" IsChecked="{Binding Path=Model.TimeUnitType, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={x:Static viewer:TimeUnitTypeEnum.Seconds}}" AutomationProperties.AutomationId="secRdoBtn"/>
</StackPanel>
</GroupBox>
</StackPanel>
<GroupBox Header="{strings:TranslateExtension SaveChart}" Margin="5" HorizontalAlignment="Left" AutomationProperties.AutomationId="SaveBx">
<StackPanel Orientation="Vertical" HorizontalAlignment="Left">
<Button Content="{strings:TranslateExtension SaveToPDF}" Margin="10" Padding="10, 5" Command="{Binding Path=Model.SaveToPDFCommand}" AutomationProperties.AutomationId="SaveToPDFBtn" />
</StackPanel>
</GroupBox>
</StackPanel>
</base:BaseView>

View File

@@ -0,0 +1,29 @@
using DTS.Common.Interface;
using DTS.Common.Interface.Sensors.SoftwareFilters;
using DTS.SensorDB;
using System.Collections.Generic;
namespace DTS.Viewer.ChartOptions
{
/// <summary>
/// Interaction logic for ChartOptionsView.xaml
/// </summary>
public partial class ChartOptionsView : IChartOptionsView
{
public ChartOptionsView()
{
InitializeComponent();
}
/// <summary>
/// FB 13120 Available filter classes
/// </summary>
public List<IFilterClass> AvailableCFC
{
get
{
return new AnalogSettingDefaults().FilterOptions;
}
}
}
}

View File

@@ -0,0 +1,244 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using DTS.Common.Base;
using Unity;
using DTS.Common.Enums.Viewer;
using DTS.Common.Events;
using DTS.Common.Interface;
using Prism.Events;
using Prism.Regions;
using DTS.Common.Interactivity;
using Prism.Commands;
// ReSharper disable UnassignedGetOnlyAutoProperty
// ReSharper disable InconsistentNaming
// ReSharper disable NotAccessedField.Local
// ReSharper disable UnusedAutoPropertyAccessor.Local
// ReSharper disable CheckNamespace
// ReSharper disable AutoPropertyCanBeMadeGetOnly.Local
// ReSharper disable RedundantDefaultMemberInitializer
namespace DTS.Viewer.ChartOptions
{
public class ChartOptionsViewModel : BaseViewModel<IChartOptionsViewModel>, IChartOptionsViewModel
{
public IBaseViewModel Parent { get; set; }
private IEventAggregator _eventAggregator { get; set; }
private IUnityContainer _unityContainer { get; set; }
public InteractionRequest<Notification> NotificationRequest { get; private set; }
public new InteractionRequest<Confirmation> ConfirmationRequest { get; private set; }
public IBaseView View { get; set; }
private IChartOptionsModel _model;
public new IChartOptionsModel Model { get => _model; set { _model = value; OnPropertyChanged("Model"); } }
/// <summary>
/// Creates a new instance of the TestSummaryViewModel.
/// </summary>
/// <param name="view">The TestListView interface.</param>
/// <param name="regionManager">The logical placeholder defined within the application's UI (in the shell or within views) into which views are displayed.</param>
/// <param name="eventAggregator">The EventAggregator which allows different components to publish/subscribe to events without being coupled to each other.</param>
/// <param name="unityContainer">The unityContainer.</param>
public ChartOptionsViewModel(IChartOptionsView view, IRegionManager regionManager, IEventAggregator eventAggregator, IUnityContainer unityContainer)
: base(regionManager, eventAggregator, unityContainer)
{
View = view;
View.DataContext = this;
NotificationRequest = new InteractionRequest<Notification>();
ConfirmationRequest = new InteractionRequest<Confirmation>();
_eventAggregator = eventAggregator;
_unityContainer = unityContainer;
_eventAggregator.GetEvent<ChartAxisChangedEvent>().Subscribe(OnChartAxisChangedEvent);
//Model = _unityContainer.Resolve<IChartOptionsModel>();
//Model.Parent = this;
//View.DataContext = Model;
}
public override void Initialize()
{
}
private string chartType = string.Empty;
public override void Initialize(object parameter)
{
Subscribe();
Model = _unityContainer.Resolve<IChartOptionsModel>();
Model.Parent = this;
View.DataContext = Model;
if (parameter is IViewerMainViewModel)
{
Parent = (IBaseViewModel)parameter;
Model.DecimateData = true;
}
else if (parameter is Tuple<IBaseViewModel, string> tuParam && tuParam.Item1 is IPSDReportMainViewModel)
{
Parent = tuParam.Item1;
chartType = tuParam.Item2;
Model.CanPublishChanges = false;
if ("Graph" == chartType)
{
Model.UnitType = ChartUnitTypeEnum.PSD;
Model.YRange = YRangeScaleEnum.Fixed;
Model.MaxFixedY = 1;
Model.MinFixedY = 1e-12; //log scale, can't be 0
Model.DecimateData = false;
}
else
{
Model.DecimateData = true;
Model.Filter = FilterOptionEnum.Unfiltered;
}
Model.CanPublishChanges = true;
}
}
private void Subscribe()
{
_eventAggregator.GetEvent<CursorsAlailableChangedEvent>().Subscribe(OnCursorsAlailableChanged);
_eventAggregator.GetEvent<GraphSelectedChannelsNotification>().Subscribe(OnGraphSelectedChannelsChanged);
}
private string Directory { get; set; }
private void OnGraphSelectedChannelsChanged(GraphSelectedChannelsNotificationArg arg)
{
if (Parent != arg?.ParentVM) return;
var channels = arg.SelectedChannels;
Model.Parent = this;
Directory = channels.Count > 0 ? channels[0].BinaryFilePath : string.Empty;
ChartOptionsVisability = (channels.Count > 0);
//whenever channels change, check the status of mV/ADC buttons
//18256 Implement StackChannelScaleFactorsEUPerADC Arm/Event Command
if (AllChannelsSupportADC(channels))
{
Model.SupportsADC = true;
}
else
{
Model.SupportsADC = false;
if (Model.UnitType == ChartUnitTypeEnum.ADC)
{
Model.UnitType = ChartUnitTypeEnum.EU;
}
}
if (AllChannelsSupportmV(channels))
{
Model.SupportsMV = true;
}
else
{
Model.SupportsMV = false;
if (Model.UnitType == ChartUnitTypeEnum.mV)
{
Model.UnitType = ChartUnitTypeEnum.EU;
}
}
PublishChanges();
}
/// <summary>
/// returns true if all channels support ADC
/// for now this is determined by looking at the sensor serial number, but we
/// can be more sophisticated in the future, as there are other channels that won't support ADC meaningfully as well
/// (like calculated channels)
/// </summary>
private bool AllChannelsSupportADC(List<ITestChannel> channels)
{
return !channels.Exists(x => Common.Enums.Hardware.HardwareConstants.IsTSRAIRSerialNumber(x.ParentModule.BaseSerialNumber));
}
/// <summary>
/// returns true if all channels support mV
/// </summary>
private bool AllChannelsSupportmV(List<ITestChannel> channels)
{
return !channels.Exists(x => Common.Enums.Hardware.HardwareConstants.IsTSRAIRSerialNumber(x.ParentModule.BaseSerialNumber));
}
private void OnCursorsAlailableChanged(bool value)
{
Model.IsCursorsAvailable = value;
}
private void OnChartAxisChangedEvent(ChartAxisChangedEventArg args)
{
if (args?.ParentVM != Parent) return;
Model.CanPublishChanges = false;
switch (args.Axis)
{
case "Y":
Model.MinFixedY = args.MinValue;
Model.MaxFixedY = args.MaxValue;
break;
case "X":
Model.MinFixedT = args.MinValue;
Model.MaxFixedT = args.MaxValue;
break;
}
Model.CanPublishChanges = true;
}
#region Properties
public object ContextSearchRegion { get; set; }
public new bool IsMenuIncluded { get; set; }
public new bool IsNavigationIncluded { get; set; }
public new bool IsBusy { get; set; }
public new bool IsDirty { get; }
private bool _chartOptionsVisability = false;
public bool ChartOptionsVisability { get => _chartOptionsVisability; set { _chartOptionsVisability = value; OnPropertyChanged("ChartOptionsVisability"); } }
public new event PropertyChangedEventHandler PropertyChanged;
public new void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion Properties
#region Methods
public void ShowMinMaxCursor(bool value)
{
_eventAggregator.GetEvent<CursorShowMinMaxChangedEvent>().Publish(value);
}
public void ResetZoomMethod()
{
Model.YRange = YRangeScaleEnum.AutoRange;
_eventAggregator.GetEvent<ResetZoomChangedEvent>().Publish(true);
}
public void ResetTMethod()
{
_eventAggregator.GetEvent<ResetZoomChangedEvent>().Publish(false);
}
public void SaveToPDFMethod()
{
_eventAggregator.GetEvent<SaveToPDFRequestedEvent>().Publish(Directory);
}
public void PublishChanges()
{
_eventAggregator.GetEvent<ChartOptionsChangedEvent>().Publish(new ChartOptionsChangedEventArg() { ParentVM = Parent, Model = Model, ChartType = chartType });
}
public void ShowCusor(bool value)
{
_eventAggregator.GetEvent<CursorShowChangedEvent>().Publish(value);
}
#endregion Methods
#region Commands
private DelegateCommand _clearMarkersCommand;
public DelegateCommand ClearMarkersCommand => _clearMarkersCommand ?? (_clearMarkersCommand = new DelegateCommand(ClearMarkersMethod));
private void ClearMarkersMethod()
{
_eventAggregator.GetEvent<CursorsClearChangedEvent>().Publish(true);
}
#endregion
}
}

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = "")]

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]