/* * Copyright 2023 Ingemar Hedvall * SPDX-License-Identifier: MIT */ #include "a2lpropertygrid.h" #include #include #include using namespace a2l; using namespace util::string; namespace a2lgui { void A2lPropertyGrid::FixNameDesc(const A2lObject& object) { Append( new wxStringProperty("Name", wxPG_LABEL, wxString::FromUTF8(object.Name()))); Append(new wxLongStringProperty("Description", wxPG_LABEL, wxString::FromUTF8(object.Description()))); } void A2lPropertyGrid::FixStringMap(const std::string_view& property_label, const std::string_view& property_name, const std::map& string_list) { if (!string_list.empty()) { wxArrayString list; for (const auto& [name, text] : string_list) { list.Add(wxString::FromUTF8(name)); } const std::string_view prop_name = property_name.empty() ? property_label : property_name; auto* item = Append( new wxArrayStringProperty(property_label.data(), prop_name.data(), list)); size_t count = 0; for (const auto& [name, value] : string_list) { std::ostringstream item_prop_name; item_prop_name << prop_name << "_" << count; AppendIn(item, new wxLongStringProperty(wxString::FromUTF8(name), item_prop_name.str(), wxString::FromUTF8(value))); ++count; } } } void A2lPropertyGrid::FixFloatList( const std::string_view& property_label, const std::string_view& property_name, const std::vector& float_list) { if (!float_list.empty()) { wxArrayString list; for (const auto value : float_list) { list.Add(FormatDouble(value, 6)); } Append( new wxArrayStringProperty(property_label.data(), property_name.empty() ? wxPG_LABEL : wxString(property_name.data()), list)); } } void A2lPropertyGrid::FixUintList(const std::string_view& property_label, const std::string_view& property_name, const std::vector& uint_list) { if (!uint_list.empty()) { wxArrayString list; for (const auto value : uint_list) { list.Add(std::to_string(value)); } Append( new wxArrayStringProperty(property_label.data(), property_name.empty() ? wxPG_LABEL : wxString(property_name.data()), list)); } } void A2lPropertyGrid::FixIntList( const std::string_view& property_label, const std::string_view& property_name, const std::vector& int_list) { if (!int_list.empty()) { wxArrayString list; for (const auto value : int_list) { list.Add(std::to_string(value)); } Append( new wxArrayStringProperty(property_label.data(), property_name.empty() ? wxPG_LABEL : wxString(property_name.data()), list)); } } void A2lPropertyGrid::FixStringList( const std::string_view& property_label, const std::string_view& property_name, const std::vector& text_list) { if (!text_list.empty()) { wxArrayString list; for (const auto& value : text_list) { list.Add(wxString::FromUTF8(value)); } const std::string_view prop_name = property_name.empty() ? property_label : property_name; auto* item = Append( new wxArrayStringProperty(property_label.data(), prop_name.data(), list)); if (text_list.size() > 1 && text_list.size() < 15) { size_t count = 0; for (const auto& text: text_list) { std::ostringstream item_prop_name; item_prop_name << prop_name << "_" << count; AppendIn(item, new wxLongStringProperty("", item_prop_name.str(), wxString::FromUTF8(text))); ++count; } } } } void A2lPropertyGrid::FixString(const std::string_view& property_label, const std::string_view& property_name, const std::string& text) { if (!text.empty()) { Append( new wxStringProperty(property_label.data(), property_name.empty() ? wxPG_LABEL : wxString(property_name.data()), wxString::FromUTF8(text))); } } void A2lPropertyGrid::FixFloat(const std::string_view& property_label, const std::string_view& property_name, double value) { if (value != 0.0) { Append( new wxFloatProperty(property_label.data(), property_name.empty() ? wxPG_LABEL : wxString(property_name.data()), value)); } } void A2lPropertyGrid::FixUint(const std::string_view& property_label, const std::string_view& property_name, uint64_t value) { if (value > 0) { Append( new wxUIntProperty(property_label.data(), property_name.empty() ? wxPG_LABEL : wxString(property_name.data()), value)); } } void A2lPropertyGrid::FixHex(const std::string_view& property_label, const std::string_view& property_name, uint64_t value) { if (value > 0) { const std::string_view prop_name = property_name.empty() ? property_label : property_name; Append( new wxUIntProperty(property_label.data(), prop_name.data(),value)); SetPropertyAttribute( prop_name.data(), wxPG_UINT_PREFIX, wxPG_PREFIX_0x ); SetPropertyAttribute( prop_name.data(), wxPG_UINT_BASE, wxPG_BASE_HEX ); } } void A2lPropertyGrid::FixInt(const std::string_view& property_label, const std::string_view& property_name, int64_t value) { if (value != 0) { Append( new wxIntProperty(property_label.data(), property_name.empty() ? wxPG_LABEL : wxString(property_name.data()), static_cast(value))); } } void A2lPropertyGrid::FixBool(const std::string_view& property_label, const std::string_view& property_name, bool value) { if (value) { Append( new wxBoolProperty(property_label.data(), property_name.empty() ? wxPG_LABEL : wxString(property_name.data()), value)); } } void A2lPropertyGrid::FixAxisPts(const std::string_view& label, const A2lAxisPts& axis) { if (axis.DataType == A2lDataType::UNKNOWN) { return; } auto *root = Append(new wxStringProperty(wxString::FromUTF8(label.data()), wxPG_LABEL, "")); { std::ostringstream temp; temp << label << " Position"; AppendIn(root, new wxUIntProperty("Position", temp.str(), axis.Position)); } { std::ostringstream temp; temp << label << " Data Type"; FixInEnumList(root, "Data Type", temp.str(), DataTypeToStringList(), axis.DataType); } { std::ostringstream temp; temp << label << " Increment"; FixInEnumList(root, "Increment", temp.str(), IndexOrderToStringList(), axis.IndexOrder); } { std::ostringstream temp; temp << label << " Address Type"; FixInEnumList(root, "Address Type", temp.str(), AddressTypeToStringList(), axis.AddressType); } } void A2lPropertyGrid::FixAxisRescale(const std::string_view& label, const A2lAxisRescale& axis) { if (axis.DataType == A2lDataType::UNKNOWN) { return; } auto *root = Append(new wxStringProperty(wxString::FromUTF8(label.data()), wxPG_LABEL, "")); { std::ostringstream temp; temp << label << " Position"; AppendIn(root, new wxUIntProperty("Position", temp.str(), axis.Position)); } { std::ostringstream temp; temp << label << " Data Type"; FixInEnumList(root, "Data Type", temp.str(), DataTypeToStringList(), axis.DataType); } { std::ostringstream temp; temp << label << " Rescale Pairs"; AppendIn(root, new wxUIntProperty("Rescale Pairs",temp.str(), axis.MaxNoRescalePairs)); } { std::ostringstream temp; temp << label << " Increment"; FixInEnumList(root, "Increment", temp.str(), IndexOrderToStringList(), axis.IndexOrder); } { std::ostringstream temp; temp << label << " Address Type"; FixInEnumList(root, "Address Type", temp.str(), AddressTypeToStringList(), axis.AddressType); } } void A2lPropertyGrid::FixDistOp(const std::string_view& label, const A2lDistOp& dist) { if (dist.DataType == A2lDataType::UNKNOWN) { return; } auto *root = Append(new wxStringProperty(wxString::FromUTF8(label.data()), wxPG_LABEL, "")); { std::ostringstream temp; temp << label << " Position"; AppendIn(root, new wxUIntProperty("Position", temp.str(), dist.Position)); } { std::ostringstream temp; temp << label << " Data Type"; FixInEnumList(root, "Data Type", temp.str(), DataTypeToStringList(), dist.DataType); } } void A2lPropertyGrid::FixFncValue(const std::string_view& label, const A2lFncValue& fnc) { if (fnc.DataType == A2lDataType::UNKNOWN) { return; } auto *root = Append(new wxStringProperty(wxString::FromUTF8(label.data()), wxPG_LABEL, "")); { std::ostringstream temp; temp << label << " Position"; AppendIn(root, new wxUIntProperty("Position", temp.str(), fnc.Position)); } { std::ostringstream temp; temp << label << " Data Type"; FixInEnumList(root, "Data Type", temp.str(), DataTypeToStringList(), fnc.DataType); } { std::ostringstream temp; temp << label << " Increment"; FixInEnumList(root, "Increment", temp.str(), IndexModeToStringList(), fnc.IndexMode); } { std::ostringstream temp; temp << label << " Address Type"; FixInEnumList(root, "Address Type", temp.str(), AddressTypeToStringList(), fnc.AddressType); } } void A2lPropertyGrid::FixExtendedLimits(const A2lExtendedLimits& limits) { if (limits.LowerLimits < limits.UpperLimits) { Append(new wxFloatProperty("Extended Lower Limit", wxPG_LABEL, limits.LowerLimits)); Append(new wxFloatProperty("Extended Upper Limit", wxPG_LABEL, limits.UpperLimits)); } } void A2lPropertyGrid::FixMaxRefresh( const A2lMaxRefresh& refresh) { if (refresh.ScalingUnit != 0 || refresh.Rate != 0) { Append(new wxUIntProperty("Refresh Scaling Unit", wxPG_LABEL, refresh.ScalingUnit)); Append(new wxUIntProperty("Refresh Rate", wxPG_LABEL, refresh.Rate)); } } void A2lPropertyGrid::FixSymbolLink(const A2lSymbolLink& symbol) { if (!symbol.SymbolName.empty()) { Append(new wxStringProperty("Symbol Name", wxPG_LABEL, wxString::FromUTF8(symbol.SymbolName))); Append(new wxIntProperty("Symbol Offset", wxPG_LABEL, static_cast(symbol.Offset))); } } A2lPropertyGrid::A2lPropertyGrid(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name) : wxPropertyGrid(parent, id, pos, size, style, name) { } void A2lPropertyGrid::Redraw() { Clear(); if (document_ == nullptr) { return; } auto& file = document_->GetFile(); auto type = document_->SelectedType(); auto* object = document_->SelectedObject(); switch (type) { case TreeItemType::ANNOTATION: if (object != nullptr ) { auto* note = static_cast(object); Redraw(*note); } break; case TreeItemType::ANNOTATION_LIST: if (object != nullptr ) { auto* notes = static_cast(object); Redraw(*notes); } break; case TreeItemType::AXIS_DESC: if (object != nullptr ) { auto* axis = static_cast(object); Redraw(*axis); } break; case TreeItemType::AXIS_PTS: if (object != nullptr ) { auto* axis = static_cast(object); Redraw(*axis); } break; case TreeItemType::BLOB: if (object != nullptr ) { auto* blob = static_cast(object); Redraw(*blob); } break; case TreeItemType::CAL_METHOD: if (object != nullptr ) { auto* method = static_cast(object); Redraw(*method); } break; case TreeItemType::CHARACTERISTIC: if (object != nullptr ) { auto* characteristic = static_cast(object); Redraw(*characteristic); } break; case TreeItemType::COMPU_METHOD: if (object != nullptr ) { auto* method = static_cast(object); Redraw(*method); } break; case TreeItemType::COMPU_TAB: if (object != nullptr ) { auto* table = static_cast(object); Redraw(*table); } break; case TreeItemType::COMPU_VTAB: if (object != nullptr ) { auto* table = static_cast(object); Redraw(*table); } break; case TreeItemType::COMPU_VTAB_RANGE: if (object != nullptr ) { auto* table = static_cast(object); Redraw(*table); } break; case TreeItemType::FRAME: if (object != nullptr ) { auto* frame = static_cast(object); Redraw(*frame); } break; case TreeItemType::FUNCTION: if (object != nullptr ) { auto* function = static_cast(object); Redraw(*function); } break; case TreeItemType::GROUP: if (object != nullptr ) { auto* group = static_cast(object); Redraw(*group); } break; case TreeItemType::INSTANCE: if (object != nullptr ) { auto* instance = static_cast(object); Redraw(*instance); } break; case TreeItemType::MEM_SEGMENT: if (object != nullptr ) { auto* segment = static_cast(object); Redraw(*segment); } break; case TreeItemType::MEM_LAYOUT: if (object != nullptr ) { auto* layout = static_cast(object); Redraw(*layout); } break; case TreeItemType::MEASUREMENT: if (object != nullptr ) { auto* measurement = static_cast(object); Redraw(*measurement); } break; case TreeItemType::MOD_PAR: if (object != nullptr ) { auto* par = static_cast(object); Redraw(*par); } break; case TreeItemType::MODULE: if (object != nullptr ) { auto* module = static_cast(object); Redraw(*module); } break; case TreeItemType::OVERWRITE: if (object != nullptr ) { auto* overwrite = static_cast(object); Redraw(*overwrite); } break; case TreeItemType::RECORD_LAYOUT: if (object != nullptr ) { auto* layout = static_cast(object); Redraw(*layout); } break; case TreeItemType::STRUCTURE: if (object != nullptr ) { auto* structure = static_cast(object); Redraw(*structure); } break; case TreeItemType::TRANSFORMER: if (object != nullptr ) { auto* transformer = static_cast(object); Redraw(*transformer); } break; case TreeItemType::UNIT: if (object != nullptr ) { auto* unit = static_cast(object); Redraw(*unit); } break; case TreeItemType::VARIANT_CODING: if (object != nullptr ) { auto* coding = static_cast(object); Redraw(*coding); } break; case TreeItemType::VAR_CHARACTERISTIC: if (object != nullptr ) { auto* characteristic = static_cast(object); Redraw(*characteristic); } break; case TreeItemType::VAR_CRITERION: if (object != nullptr ) { auto* criterion = static_cast(object); Redraw(*criterion); } break; case TreeItemType::A2L_FILE: case TreeItemType::PROJECT: default: Redraw(file); break; } // SetPropertyReadOnly(GetRoot()); } void A2lPropertyGrid::Redraw(const a2l::A2lFile& file) { Append( new wxPropertyCategory("ASAP2 File") ); Append( new wxStringProperty("Name", "name", wxString::FromUTF8(file.Name()))); Append( new wxFileProperty("File Name", "filename", wxString::FromUTF8(file.Filename()))); const auto& version = file.A2lVersion(); if (version.VersionNo > 0) { Append( new wxPropertyCategory("ASAP2 Version") ); Append( new wxUIntProperty("Version No", "a2lversion", version.VersionNo)); Append( new wxUIntProperty("Upgrade No", "a2lupgrade", version.UpgradeNo)); } const auto& a2ml = file.A2mlVersion(); if (a2ml.VersionNo > 0) { Append( new wxPropertyCategory("A2ML Version") ); Append( new wxUIntProperty("Version No", "a2mlversion", a2ml.VersionNo)); Append( new wxUIntProperty("Upgrade No", "a2mlupgrade", a2ml.UpgradeNo)); } const auto& project = file.Project(); Append( new wxPropertyCategory("Project") ); Append( new wxStringProperty("Name", "projname", wxString::FromUTF8(project.Name()))); Append( new wxLongStringProperty("Description", "projdesc", wxString::FromUTF8(project.Description()))); const auto& header = project.Header(); Append( new wxLongStringProperty("Comments", "projcomment", wxString::FromUTF8(header.Comment))); Append( new wxStringProperty("Version", "projversion", wxString::FromUTF8(header.VersionNo))); Append( new wxStringProperty("Project", "projno", wxString::FromUTF8(header.ProjectNo))); FixPropertyMap( "ECU", "modules", project.Modules()); } void A2lPropertyGrid::Redraw(const a2l::Module& module) { Append(new wxPropertyCategory("ECU")); FixNameDesc(module); const auto& a2ml = module.A2ml(); if (!a2ml.empty()) { Append(new wxLongStringProperty("Meta-Language", "a2ml", wxString::FromUTF8(a2ml))); } FixStringMap("Interface Data", "if_data", module.IfDatas()); Append(new wxPropertyCategory("ECU Specific Definitions")); const auto& common = module.ModCommon(); Append(new wxLongStringProperty("Comment", "common_comment", wxString::FromUTF8(common.Comment))); FixUint("Alignment Int8", "", common.AlignmentByte); FixUint("Alignment Int16", "", common.AlignmentWord); FixUint("Alignment Int32", "", common.AlignmentLong); FixUint("Alignment Int64", "", common.AlignmentInt64); FixUint("Alignment Float16", "", common.AlignmentFloat16); FixUint("Alignment Float32", "", common.AlignmentFloat32); FixUint("Alignment Float64", "", common.AlignmentFloat64); FixEnumList("Byte Order", "byte_order", ByteOrderToStringList(), common.ByteOrder); FixUint("Data Size [bytes]", "data_size", common.DataSize); FixEnumList("Deposit Mode for Axis", "deposit", DepositToStringList(), common.Deposit); DrawCategory(module.ModPar()); Append(new wxPropertyCategory("ECU Objects")); FixPropertyMap("Axis Points Distributions", "axis", module.AxisPtss()); FixPropertyMap("Binary Large Objects", "blob", module.Blobs()); FixPropertyMap("Adjustable Objects", "char", module.Characteristics()); FixPropertyMap("Conversion Methods", "method", module.CompuMethods()); FixPropertyMap("Conversion Tables", "table", module.CompuTabs()); FixPropertyMap("Verbal Conversion Tables", "vtable", module.CompuVtabs()); FixPropertyMap("VTAB Ranges", "vtable_r", module.CompuVtabRanges()); FixPropertyMap("Frames", "frame", module.Frames()); FixPropertyMap("Function Descriptions", "function", module.Functions()); FixPropertyMap("Group Declarations", "group", module.Groups()); FixPropertyMap("Instances", "instance", module.Instances()); FixPropertyMap("Measurement Objects", "meas", module.Measurements()); const auto& user_list = module.UserRights(); if (!user_list.empty()) { for (const auto& [level, user_right] : user_list) { std::ostringstream cat_name; cat_name << level << "_cat"; Append(new wxPropertyCategory("User Rights", cat_name.str())); std::ostringstream user_level; user_level << level << "_level"; Append(new wxStringProperty("User Level", user_level.str(), wxString::FromUTF8(level))); std::ostringstream user_read; user_read << level << "_read"; FixBool("Read-Only", user_read.str(), user_right->ReadOnly); if (!user_right->RefGroupList.empty()) { size_t group = 0; for (const auto& group_list : user_right->RefGroupList) { std::ostringstream user_group; user_group << level << "_group_" << group; FixStringList("Group References", user_group.str(), group_list); ++group; } } } } } void A2lPropertyGrid::Redraw(const a2l::A2lModPar& par) { DrawCategory(par); } void A2lPropertyGrid::DrawCategory( const A2lModPar& par) { Append(new wxPropertyCategory("ECU Management Data")); Append(new wxLongStringProperty("Comment", "par_comment", wxString::FromUTF8(par.Comment))); FixUintList("Address of EEPROM Identifiers", "eepk", par.AddressEpkList); wxArrayString cal_method_list; for (const auto& cal_method : par.CalibrationMethodList) { cal_method_list.Add(cal_method.Method); } if (!cal_method_list.IsEmpty()) { Append(new wxArrayStringProperty("Access Methods", "access_method", cal_method_list)); } FixString("CPU Type", "cpu_type", par.CpuType); FixString("Customer", "customer", par.Customer); FixString("Customer Number", "customer_no", par.CustomerNo); FixString("Control Unit", "control_unit", par.Ecu); Append(new wxIntProperty("Calibration Offset", "cal_offset", static_cast(par.EcuCalibrationOffset))); FixString("EPROM Identifier", "epk", par.Epk); FixUint("Number of Interfaces", "interface", par.NoOfInterfaces); if (!par.MemoryLayoutList.empty()) { wxArrayString enum_list; for (const auto& layout : par.MemoryLayoutList) { enum_list.Add(PrgTypeToString(layout.Type).data()); } Append(new wxArrayStringProperty("Memory Segments", wxPG_LABEL, enum_list)); } if (!par.MemorySegmentList.empty()) { wxArrayString name_list; for (const auto& seg : par.MemorySegmentList) { name_list.Add(wxString::FromUTF8(seg.Name)); } Append(new wxArrayStringProperty("Memory Segments", "segments", name_list)); } FixString("PhoneNo", "phone_no", par.PhoneNo); FixString("Supplier", "supplier", par.Supplier); FixString("User", "user", par.User); FixString("Version", "par_version", par.Version); FixStringMap("System Constants", "sys_const", par.SystemConstantList); } void A2lPropertyGrid::Redraw(const A2lCalibrationMethod& method) { Append(new wxPropertyCategory("Calibration Method")); Append( new wxStringProperty("Method", wxPG_LABEL, wxString::FromUTF8(method.Method))); Append( new wxUIntProperty("Version", wxPG_LABEL, method.Version)); if (!method.CalibrationHandleList.empty()) { wxArrayString list; for (const auto& object : method.CalibrationHandleList) { list.Add(wxString::FromUTF8(object.Comment)); } auto item = Append(new wxArrayStringProperty("Calibration Handles", wxPG_LABEL,list)); size_t count = 0; for (const auto& handle : method.CalibrationHandleList) { wxArrayString handle_list; for (auto address : handle.HandleList) { handle_list.Add(std::to_string(address)); } std::ostringstream prop_name; prop_name << "handle_" << count; AppendIn(item, new wxArrayStringProperty( wxString::FromUTF8(handle.Comment), prop_name.str(),handle_list)); ++count; } } } void A2lPropertyGrid::Redraw(const A2lMemoryLayout& layout) { Append(new wxPropertyCategory("Memory Layout")); FixEnumList("Type","", PrgTypeToStringList(),layout.Type); FixHex("Address", "", layout.Address); FixIntList("Offset","", layout.OffsetList); FixStringMap("Interface Data","", layout.IfDataList); } void A2lPropertyGrid::Redraw(const A2lMemorySegment& segment) { Append(new wxPropertyCategory("Memory Segment")); Append( new wxStringProperty("Name", wxPG_LABEL, wxString::FromUTF8(segment.Name))); Append( new wxStringProperty("Description", wxPG_LABEL, wxString::FromUTF8(segment.Description))); FixEnumList("Segment Type","", SegmentTypeToStringList(), segment.SegmentType); FixEnumList("Memory Type","", MemoryTypeToStringList(), segment.MemoryType); FixEnumList("Memory Attribute","", MemoryAttributeToStringList(), segment.Attribute); FixHex("Address", "", segment.Address); FixIntList("Offset","", segment.OffsetList); FixStringMap("Interface Data","", segment.IfDataList); } void A2lPropertyGrid::Redraw(const AxisDescr& axis) { Append(new wxPropertyCategory("Axis Description")); FixEnumList("Type", "", AxisTypeToStringList(), axis.AxisType()); Append( new wxStringProperty("Input Quantity", wxPG_LABEL, wxString::FromUTF8(axis.InputQuantity()))); Append( new wxStringProperty("Conversion", wxPG_LABEL, wxString::FromUTF8(axis.Conversion()))); Append( new wxUIntProperty("Axis Points", wxPG_LABEL,axis.MaxAxisPoints())); Append( new wxFloatProperty("Lower Limit", wxPG_LABEL, axis.LowerLimit())); Append( new wxFloatProperty("Upper Limit", wxPG_LABEL, axis.UpperLimit())); FixString("Axis Point Reference", "", axis.AxisPtsRef()); FixEnumList( "Byte Order", "", ByteOrderToStringList(), axis.ByteOrder()); FixString("Curve Axis Reference", "", axis.CurveAxisRef()); FixEnumList("Deposit", "", DepositToStringList(), axis.Deposit()); FixExtendedLimits(axis.ExtendedLimits()); const auto& par = axis.FixAxisPar(); if (par.Offset != 0.0 || par.Shift != 0.0 || par.NoAxisPoints > 0) { Append( new wxFloatProperty("Fixed Axis Offset", wxPG_LABEL, par.Offset)); Append( new wxFloatProperty("Fixed Axis Shift", wxPG_LABEL, par.Shift)); Append( new wxUIntProperty("Fixed Axis Points", wxPG_LABEL, par.NoAxisPoints)); } const auto& dist = axis.FixAxisParDist(); if (dist.Offset != 0.0 || dist.Distance != 0.0 || dist.NoAxisPoints > 0) { Append( new wxFloatProperty("Fixed Axis Distance Offset", wxPG_LABEL, dist.Offset)); Append( new wxFloatProperty("Fixed Axis Distance", wxPG_LABEL, dist.Distance)); Append( new wxUIntProperty("Fixed Axis Distance Points", wxPG_LABEL, dist.NoAxisPoints)); } FixFloatList("Fixed Axis List", "", axis.FixAxisParList()); FixString("Format", "", axis.Format()); FixFloat("Max Gradient", "", axis.MaxGrad()); FixEnumList("Monotony", "", MonotonyToStringList(), axis.Monotony()); FixString("Physical Unit", "", axis.PhysUnit()); FixBool("Read-Only", "", axis.ReadOnly()); FixFloat("Step Size", "", axis.StepSize()); } void A2lPropertyGrid::Redraw(const AxisPts& axis) { Append(new wxPropertyCategory("Axis Point Distribution")); FixNameDesc(axis); FixHex("Address", "", axis.Address()); Append( new wxStringProperty("Input Quantity", wxPG_LABEL, wxString::FromUTF8(axis.InputQuantity()))); Append( new wxStringProperty("Record Reference", wxPG_LABEL, wxString::FromUTF8(axis.RefRecord()))); Append( new wxFloatProperty("Max Difference", wxPG_LABEL, axis.MaxDiff())); Append( new wxStringProperty("Conversion", wxPG_LABEL, wxString::FromUTF8(axis.Conversion()))); Append( new wxUIntProperty("Max axis Points", wxPG_LABEL, axis.MaxAxisPoints())); Append( new wxFloatProperty("Lower Limit", wxPG_LABEL, axis.LowerLimit())); Append( new wxFloatProperty("Upper Limit", wxPG_LABEL, axis.UpperLimit())); FixEnumList("Byte Order", "", ByteOrderToStringList(), axis.ByteOrder()); FixEnumList("Calibration Access", "", CalibrationAccessToStringList(), axis.CalibrationAccess()); FixEnumList("Deposit", "", DepositToStringList(), axis.Deposit()); FixString( "Display Identifier", "", axis.DisplayIdentifier()); FixInt("ECU Address Extension", "", axis.EcuAddressExtension()); FixExtendedLimits(axis.ExtendedLimits()); FixString("Format", "", axis.Format()); FixStringList("Functions", "", axis.FunctionList()); FixBool( "Guard Rails", "", axis.GuardRails()); FixStringMap( "Network Communication", "", axis.IfDatas()); FixMaxRefresh(axis.MaxRefresh()); FixString("Model Link", "", axis.ModelLink()); FixEnumList("Monotony", "", MonotonyToStringList(), axis.Monotony()); FixString("Physical Unit", "", axis.PhysUnit()); FixBool("Read-Only", "", axis.ReadOnly()); FixString("Memory Segment Reference", "", axis.RefMemorySegment()); FixFloat("Step Size", "", axis.StepSize()); FixSymbolLink(axis.SymbolLink()); } void A2lPropertyGrid::Redraw(const Blob& blob) { Append(new wxPropertyCategory("Binary Large Object")); FixNameDesc(blob); FixHex("Address", "", blob.Address()); Append( new wxUIntProperty("Size", wxPG_LABEL, blob.Size())); FixEnumList("Address Type", "", AddressTypeToStringList(), blob.AddressType()); FixEnumList("Calibration Access", "", CalibrationAccessToStringList(), blob.CalibrationAccess()); FixString("Display Identifier", "", blob.DisplayIdentifier()); FixInt("ECU Address Extension", "", blob.EcuAddressExtension()); FixStringMap( "Network Communication", "", blob.IfDatas()); FixMaxRefresh(blob.MaxRefresh()); FixString("Model Link", "", blob.ModelLink()); FixSymbolLink(blob.SymbolLink()); } void A2lPropertyGrid::Redraw(const Characteristic& object) { Append(new wxPropertyCategory("Characteristic")); FixNameDesc(object); FixEnumList("Type", "", CharacteristicTypeToStringList(), object.Type()); FixHex("Address", "", object.Address()); Append(new wxStringProperty("Reference to Data Record", wxPG_LABEL, wxString::FromUTF8(object.Deposit()))); Append(new wxFloatProperty("Max Difference", wxPG_LABEL, object.MaxDiff())); Append(new wxStringProperty("Conversion", wxPG_LABEL, wxString::FromUTF8(object.Conversion()))); Append(new wxFloatProperty("Lower Limit", wxPG_LABEL, object.LowerLimit())); Append(new wxFloatProperty("Upper Limit", wxPG_LABEL, object.UpperLimit())); FixHex("Bit Mask", "", object.BitMask()); FixEnumList("Byte Order", "", ByteOrderToStringList(), object.ByteOrder()); FixEnumList("CalibrationAccess", "", CalibrationAccessToStringList(), object.CalibrationAccess()); FixString("Comparison Quantity", "", object.ComparisonQuantity()); const auto& dep = object.DependentCharacteristic(); if (!dep.Formula.empty() || !dep.CharacteristicList.empty()) { Append(new wxLongStringProperty("Dependent Formula", wxPG_LABEL, wxString::FromUTF8(dep.Formula))); FixStringList("Dependent List", "", dep.CharacteristicList); } FixBool("Discrete", "", object.Discrete()); FixString( "Display Identifier", "", object.DisplayIdentifier()); FixInt("ECU Address Extension", "", object.EcuAddressExtension()); if (object.Encoding() != A2lEncoding::ASCII) { FixEnumList("Encoding", "", EncodingToStringList(), object.Encoding()); } FixExtendedLimits(object.ExtendedLimits()); FixString( "Format", "", object.Format()); FixStringList( "Function List", "", object.FunctionList()); FixBool("Guard Rails", "", object.GuardRails()); FixStringMap( "Network Communication", "", object.IfDatas()); FixStringList( "Map List", "", object.MapList()); FixUintList( "Matrix Dimension", "", object.MatrixDim()); FixMaxRefresh(object.MaxRefresh()); FixString( "Model Link", "", object.ModelLink()); FixUint("Number of Bytes", "", object.Number()); FixString("Physical Unit", "", object.PhysUnit()); FixBool("Read-Only", "", object.ReadOnly()); FixString("Memory Segment Reference", "", object.RefMemorySegment()); FixFloat("Step Size", "", object.StepSize()); FixSymbolLink(object.SymbolLink()); const auto& virt = object.VirtualCharacteristic(); if (!virt.Formula.empty() || !virt.CharacteristicList.empty()) { Append(new wxLongStringProperty(" Virtual Formula", wxPG_LABEL, wxString::FromUTF8(virt.Formula))); FixStringList("Virtual List", "", virt.CharacteristicList); } } void A2lPropertyGrid::Redraw(const AnnotationList& list) { Append(new wxPropertyCategory("Notes")); size_t count = 0; for (const auto& note : list) { std::ostringstream label; if (!note.Label.empty()) { label << note.Label; } if (!note.Origin.empty()) { if (!label.str().empty()) { label << "/"; } } std::ostringstream name; name << "note_" << count; wxArrayString text_list; for (const auto& text : note.Text) { text_list.Add(wxString::FromUTF8(text)); } Append(new wxArrayStringProperty(wxString::FromUTF8(label.str()), name.str(), text_list)); } } void A2lPropertyGrid::Redraw(const A2lAnnotation& note) { Append(new wxPropertyCategory("Note")); FixString("Label", "", note.Label); FixString("Origin", "", note.Origin); FixStringList("Text", "", note.Text); } void A2lPropertyGrid::Redraw(const CompuMethod& method) { Append(new wxPropertyCategory("Conversion Method")); FixNameDesc(method); FixEnumList("Type", "", ConversionTypeToStringList(), method.Type()); Append(new wxStringProperty("Format", wxPG_LABEL, wxString::FromUTF8(method.Format()))); Append(new wxStringProperty("Unit", wxPG_LABEL, wxString::FromUTF8(method.PhysUnit()))); FixFloatList("Float Coefficients", "" , method.Coeffs()); FixFloatList("Linear Coefficients", "" , method.CoeffsLinear()); FixString("Table Conversion Reference", "" , method.CompuTabRef()); FixString("Formula", "" , method.Formula()); FixString("Inverse Formula", "" , method.FormulaInv()); FixString("Unit Reference", "" , method.RefUnit()); FixString("Status Strings Reference", "" , method.StatusStringRef()); } void A2lPropertyGrid::Redraw(const CompuTab& table) { Append(new wxPropertyCategory("Conversion Table")); FixNameDesc(table); FixEnumList("Type", "", ConversionTypeToStringList(), table.Type()); auto item = Append(new wxUIntProperty("Value Pairs", wxPG_LABEL, table.Rows())); int count = 0; const auto& value_list = table.KeyValueList(); for (const auto [key, value] : value_list) { auto name = FormatDouble(key, 6); std::ostringstream prop_name; prop_name << "key_" << count; AppendIn(item, new wxFloatProperty(name, prop_name.str(), value)); ++count; } FixString("Default Value", "" , table.DefaultValue()); FixFloat("Numeric Default Value", "" , table.DefaultValueNumeric()); } void A2lPropertyGrid::Redraw(const CompuVtab& table) { Append(new wxPropertyCategory("Conversion String Table")); FixNameDesc(table); FixEnumList("Type", "", ConversionTypeToStringList(), table.Type()); auto item = Append(new wxUIntProperty("Value Pairs", wxPG_LABEL, table.Rows())); int count = 0; const auto& value_list = table.KeyValueList(); for (const auto& [key, value] : value_list) { auto name = FormatDouble(key, 6); std::ostringstream prop_name; prop_name << "key_" << count; AppendIn(item, new wxStringProperty(name, prop_name.str(), wxString::FromUTF8(value))); ++count; } FixString("Default Value", "" , table.DefaultValue()); } void A2lPropertyGrid::Redraw(const CompuVtabRange& table) { Append(new wxPropertyCategory("Conversion String Table")); FixNameDesc(table); auto item = Append(new wxUIntProperty("Value Pairs", wxPG_LABEL, table.Rows())); int count = 0; const auto& value_list = table.KeyValueList(); for (const auto& [key, value] : value_list) { std::ostringstream range; range << FormatDouble(key.first, 6) << ".." << FormatDouble(key.second, 6); std::ostringstream prop_name; prop_name << "key_" << count; AppendIn(item, new wxStringProperty(range.str(), prop_name.str(), wxString::FromUTF8(value))); ++count; } FixString("Default Value", "" , table.DefaultValue()); } void A2lPropertyGrid::Redraw(const Frame& frame) { Append(new wxPropertyCategory("Frame")); FixNameDesc(frame); Append(new wxUIntProperty("Scaling Unit", wxPG_LABEL, frame.ScalingUnit())); Append(new wxUIntProperty("Rate", wxPG_LABEL, frame.Rate())); FixStringList("Measurement Objects", "", frame.FrameMeasurement()); FixStringMap("Network Communication", "", frame.IfDatas()); } void A2lPropertyGrid::Redraw(const Function& function) { Append(new wxPropertyCategory("Frame")); FixNameDesc(function); FixString("Component Type", "", function.ComponentType()); FixString("Prototype", "", function.PrototypeOf()); FixStringList("Default Characteristics", "", function.DefaultCharacteristics()); FixString("Version", "", function.Version()); FixStringMap("Network Communication", "", function.IfDatas()); FixStringList("Input Measurements", "", function.InMeasurements()); FixStringList("Local Measurements", "", function.LocMeasurements()); FixStringList("Output Measurements", "", function.OutMeasurements()); FixStringList("Characteristic References", "", function.RefCharacteristics()); FixStringList("Sub-Functions", "", function.SubFunctions()); } void A2lPropertyGrid::Redraw(const Group& group) { Append(new wxPropertyCategory("Group")); FixNameDesc(group); FixStringList("Function References", "", group.FunctionList()); FixStringMap("Network Communication", "", group.IfDatas()); FixStringList("Characteristic References", "", group.RefCharacteristics()); FixStringList("Measurement References", "", group.RefMeasurements()); FixBool("Root Group", "", group.Root()); FixStringList("Sub-Groups", "", group.SubGroups()); } void A2lPropertyGrid::Redraw(const Instance& instance) { Append(new wxPropertyCategory("Instance")); FixNameDesc(instance); Append(new wxStringProperty("Type", wxPG_LABEL, wxString::FromUTF8(instance.RefTypeDef()))); FixHex("Address", "", instance.Address()); FixEnumList("Address Type", "", AddressTypeToStringList(), instance.AddressType()); FixEnumList("Calibration Access", "", CalibrationAccessToStringList(), instance.CalibrationAccess()); FixString("Display Identifier", "", instance.DisplayIdentifier()); FixInt("ECU Address Extension", "", instance.EcuAddressExtension()); FixStringMap("Network Communication", "", instance.IfDatas()); FixEnumList("Layout", "", LayoutToStringList(), instance.Layout()); FixUintList("Matrix Dimension", "", instance.MatrixDim()); FixMaxRefresh(instance.MaxRefresh()); FixString("Model Link", "", instance.ModelLink()); FixBool("Read and Write", "", instance.ReadWrite()); FixSymbolLink(instance.SymbolLink()); } void A2lPropertyGrid::Redraw(const Overwrite& object) { Append(new wxPropertyCategory("Overwrite")); Append(new wxStringProperty("Name", wxPG_LABEL, wxString::FromUTF8(object.Name()))); Append(new wxUIntProperty("Axis", wxPG_LABEL,object.AxisNo())); FixString("Conversion", "", object.Conversion()); FixExtendedLimits(object.ExtendedLimits()); FixString("Format", "", object.Format()); FixString("Input Quantity", "", object.InputQuantity()); if (object.LowerLimit() < object.UpperLimit()) { Append(new wxFloatProperty("Lower Limit", wxPG_LABEL,object.LowerLimit())); Append(new wxFloatProperty("Upper Limit", wxPG_LABEL,object.UpperLimit())); } FixEnumList("Monotony", "", MonotonyToStringList(), object.Monotony()); FixString("Physical Unit", "", object.PhysUnit()); } void A2lPropertyGrid::Redraw(const Measurement& meas) { Append(new wxPropertyCategory("Measurement")); FixNameDesc(meas); FixEnumList("Data Type", "", DataTypeToStringList(), meas.DataType()); Append(new wxStringProperty("Conversion", wxPG_LABEL, wxString::FromUTF8(meas.Conversion()))); Append(new wxUIntProperty("Resolution", wxPG_LABEL, meas.Resolution())); Append(new wxFloatProperty("Accuracy", wxPG_LABEL, meas.Accuracy())); Append(new wxFloatProperty("Lower Limit", wxPG_LABEL, meas.LowerLimit())); Append(new wxFloatProperty("Upper Limit", wxPG_LABEL, meas.UpperLimit())); FixEnumList("Address Type", "", AddressTypeToStringList(), meas.AddressType()); FixUint("Array Size", "", meas.ArraySize()); FixHex("Bit Mask", "", meas.BitMask()); const auto& operation = meas.BitOperation(); FixUint("Left Shift", "", operation.LeftShift); FixUint("Right Shift", "", operation.RightShift); FixBool("Extended Sign", "", operation.SignExtended); FixEnumList("Byte Order", "", ByteOrderToStringList(), meas.ByteOrder()); FixBool("Discrete", "", meas.Discrete()); FixString( "Display Identifier", "", meas.DisplayIdentifier()); FixHex("ECU Address", "", meas.EcuAddress()); FixInt("ECU Address Extension", "", meas.EcuAddressExtension()); FixHex("Error Mask", "", meas.ErrorMask()); FixString( "Format", "", meas.Format()); FixStringList( "Function List", "", meas.FunctionList()); FixStringMap( "Network Communication", "", meas.IfDatas()); FixEnumList("Layout", "", LayoutToStringList(), meas.Layout()); FixUintList( "Matrix Dimension", "", meas.MatrixDim()); FixMaxRefresh(meas.MaxRefresh()); FixString( "Model Link", "", meas.ModelLink()); FixString("Physical Unit", "", meas.PhysUnit()); FixBool("Read and Write", "", meas.ReadWrite()); FixString("Memory Segment Reference", "", meas.RefMemorySegment()); FixSymbolLink(meas.SymbolLink()); FixStringList("Virtual Measurements", "", meas.Virtuals()); } void A2lPropertyGrid::Redraw(const RecordLayout& layout) { Append(new wxPropertyCategory("Record Layout")); Append(new wxStringProperty("Name", wxPG_LABEL, wxString::FromUTF8(layout.Name()))); FixUint("Alignment Int8", "", layout.AlignmentByte()); FixUint("Alignment Int16", "", layout.AlignmentWord()); FixUint("Alignment Int32", "", layout.AlignmentLong()); FixUint("Alignment Int64", "", layout.AlignmentInt64()); FixUint("Alignment Float16", "", layout.AlignmentFloat16()); FixUint("Alignment Float32", "", layout.AlignmentFloat32()); FixUint("Alignment Float64", "", layout.AlignmentFloat64()); FixAxisPts("X Axis Point", layout.AxisPtsX()); FixAxisPts("Y Axis Point", layout.AxisPtsY()); FixAxisPts("Z Axis Point", layout.AxisPtsZ()); FixAxisPts("4 Axis Point", layout.AxisPts4()); FixAxisPts("5 Axis Point", layout.AxisPts5()); FixAxisRescale("X Axis Rescale", layout.AxisRescaleX()); FixDistOp("X Distance", layout.DistOpX()); FixDistOp("Y Distance", layout.DistOpY()); FixDistOp("Z Distance", layout.DistOpZ()); FixDistOp("4 Distance", layout.DistOp4()); FixDistOp("5 Distance", layout.DistOp5()); FixUint("X Axis Fixed Points", "", layout.FixNoAxisPtsX()); FixUint("Y Axis Fixed Points", "", layout.FixNoAxisPtsY()); FixUint("Z Axis Fixed Points", "", layout.FixNoAxisPtsZ()); FixUint("4 Axis Fixed Points", "", layout.FixNoAxisPts4()); FixUint("5 Axis Fixed Points", "", layout.FixNoAxisPts5()); FixFncValue("Function Value", layout.FncValues()); const auto& ident = layout.Identification(); if ( ident.DataType != A2lDataType::UNKNOWN ) { Append(new wxUIntProperty("Identification Position", wxPG_LABEL, ident.Position)); FixEnumList("Identification Data Type", "", DataTypeToStringList(), ident.DataType); } FixDistOp("X No Axis Points", layout.NoAxisPtsX()); FixDistOp("Y No Axis Points", layout.NoAxisPtsY()); FixDistOp("Z No Axis Points", layout.NoAxisPtsX()); FixDistOp("4 No Axis Points", layout.NoAxisPts4()); FixDistOp("5 No Axis Points", layout.NoAxisPts5()); FixDistOp("X No Rescale", layout.NoRescaleX()); FixDistOp("X Offset", layout.OffsetX()); FixDistOp("Y Offset", layout.OffsetY()); FixDistOp("Z Offset", layout.OffsetZ()); FixDistOp("4 Offset", layout.Offset4()); FixDistOp("5 Offset", layout.Offset5()); const auto& reserved_list = layout.ReservedList(); size_t reserved_count = 1; for (const auto& reserved : reserved_list) { std::ostringstream res_name; res_name << "Reserved " << reserved_count; FixDistOp(res_name.str(), reserved); ++reserved_count; } FixDistOp("W RIP Address", layout.RipAddrW()); FixDistOp("X RIP Address", layout.RipAddrX()); FixDistOp("Y RIP Address", layout.RipAddrY()); FixDistOp("Z RIP Address", layout.RipAddrZ()); FixDistOp("4 RIP Address", layout.RipAddr4()); FixDistOp("5 RIP Address", layout.RipAddr5()); FixDistOp("X Shift Operand", layout.ShiftOpX()); FixDistOp("Y Shift Operand", layout.ShiftOpY()); FixDistOp("Z Shift Operand", layout.ShiftOpZ()); FixDistOp("4 Shift Operand", layout.ShiftOp4()); FixDistOp("5 Shift Operand", layout.ShiftOp5()); FixDistOp("X Source Address", layout.SrcAddrX()); FixDistOp("Y Source Address", layout.SrcAddrY()); FixDistOp("Z Source Address", layout.SrcAddrZ()); FixDistOp("4 Source Address", layout.SrcAddr4()); FixDistOp("5 Source Address", layout.SrcAddr5()); FixBool("Static Address Offset", "", layout.StaticAddressOffsets()); FixBool("Static Record Layout", "", layout.StaticRecordLayout()); } void A2lPropertyGrid::Redraw(const Transformer& transformer) { Append(new wxPropertyCategory("Transformer")); Append(new wxStringProperty("Name", wxPG_LABEL, wxString::FromUTF8(transformer.Name()))); Append(new wxStringProperty("Version", wxPG_LABEL, wxString::FromUTF8(transformer.Version()))); Append(new wxStringProperty("32-bit Executable", wxPG_LABEL, wxString::FromUTF8(transformer.Executable32()))); Append(new wxStringProperty("64-bit Executable", wxPG_LABEL, wxString::FromUTF8(transformer.Executable64()))); Append(new wxUIntProperty("Timeout", wxPG_LABEL,transformer.Timeout())); FixEnumList("Trigger", "", TriggerToStringList(), transformer.Trigger()); Append(new wxStringProperty("Inverse Transformer", wxPG_LABEL, wxString::FromUTF8(transformer.InverseTransformer()))); FixStringList("Input Objects", "", transformer.TransformerInObjects()); FixStringList("Output Objects", "", transformer.TransformerOutObjects()); } void A2lPropertyGrid::Redraw(const Structure& structure) { Append(new wxPropertyCategory("Structure")); FixNameDesc(structure); Append(new wxUIntProperty("Size", wxPG_LABEL,structure.Size())); FixEnumList("Address Type", "", AddressTypeToStringList(), structure.AddressType()); FixBool("Consistent Exchange", "", structure.ConsistentExchange()); FixString("Symbol Type Link", "", structure.SymbolTypeLink()); const auto& list = structure.StructureComponents(); size_t count = 1; for (const auto& [name, component] : list) { std::ostringstream cat_text; cat_text << "Component " << count; Append(new wxPropertyCategory(cat_text.str())); std::ostringstream prop_name; prop_name << name << "_name"; Append(new wxStringProperty("Name", prop_name.str(), wxString::FromUTF8(component->Name))); std::ostringstream prop_typedef; prop_typedef << name << "_typedef"; Append(new wxStringProperty("Typedef", prop_typedef.str(), wxString::FromUTF8(component->Typedef))); std::ostringstream prop_offset; prop_offset << name << "_offset"; Append(new wxUIntProperty("Offset", prop_offset.str(), component->AddressOffset)); std::ostringstream prop_type; prop_type << name << "_type"; FixEnumList("Address Type", prop_type.str(), AddressTypeToStringList(), component->AddressType); std::ostringstream prop_layout; prop_layout << name << "_layout"; FixEnumList("Layout", prop_layout.str(), LayoutToStringList(), component->Layout); std::ostringstream prop_matrix; prop_matrix << name << "_matrix"; FixUintList("Matrix Dimension", prop_matrix.str(), component->MatrixDim); std::ostringstream prop_link; prop_link << name << "_link"; FixString("Symbol Type Link", prop_link.str(), structure.SymbolTypeLink()); ++count; } } void A2lPropertyGrid::Redraw(const Unit& unit) { Append(new wxPropertyCategory("Unit")); FixNameDesc(unit); Append(new wxStringProperty("Display Identifier", wxPG_LABEL, wxString::FromUTF8(unit.DisplayIdentifier()))); FixEnumList("Type", "", UnitTypeToStringList(), unit.Type()); FixString("Unit Reference", "", unit.RefUnit()); const auto& exp = unit.SiExponents(); if (exp.HasExponent()) { Append(new wxIntProperty("Length SI Exponent", wxPG_LABEL, static_cast(exp.Length))); Append(new wxIntProperty("Mass SI Exponent", wxPG_LABEL, static_cast(exp.Mass))); Append(new wxIntProperty("Time SI Exponent", wxPG_LABEL, static_cast(exp.Time))); Append(new wxIntProperty("Current SI Exponent", wxPG_LABEL, static_cast(exp.ElectricCurrent))); Append(new wxIntProperty("Temperature SI Exponent", wxPG_LABEL, static_cast(exp.Temperature))); Append(new wxIntProperty("Amount SI Exponent", wxPG_LABEL, static_cast(exp.AmountOfSubstance))); Append(new wxIntProperty("Luminous SI Exponent", wxPG_LABEL, static_cast(exp.LuminousIntensity))); } FixFloat("Gradient", "", unit.Gradient()); FixFloat("Offset", "", unit.Offset()); } void A2lPropertyGrid::Redraw(const A2lVariantCoding& object) { Append(new wxPropertyCategory("Variant Coding")); { std::vector list; for (const auto& [name, obj] : object.CharacteristicList) { list.emplace_back(name); } FixStringList("Variant Characteristics", "", list); } { std::vector list; for (const auto& [name, obj] : object.CriterionList) { list.emplace_back(name); } FixStringList("Variant Criterion", "", list); } size_t count = 0; for (const auto& comb_list : object.ForbiddenCombList) { std::ostringstream list_name; list_name << "comb_list_" << count; FixStringMap("Forbidden Combinations", list_name.str(), comb_list); ++count; } FixString("Naming", "", object.Naming); FixString("Separator", "", object.Separator); } void A2lPropertyGrid::Redraw(const A2lVarCharacteristic& object) { Append(new wxPropertyCategory("Variant Characteristic")); Append(new wxStringProperty("Name", wxPG_LABEL, wxString::FromUTF8(object.Name))); FixStringList("Criterion Names", "", object.CriterionNameList); FixUintList("Variant Address", "", object.AddressList); } void A2lPropertyGrid::Redraw(const A2lVarCriterion& object) { Append(new wxPropertyCategory("Variant Criterion")); Append(new wxStringProperty("Name", wxPG_LABEL, wxString::FromUTF8(object.Name))); Append(new wxStringProperty("Description", wxPG_LABEL, wxString::FromUTF8(object.Description))); FixStringList("Values", "", object.ValueList); FixString("Measurement", "", object.Measurement); FixString("Characteristic", "", object.SelectionCharacteristic); } } // namespace a2lgui