From 0d903d43a0d0ddcfec2ca2c95c8e96090bdb757f Mon Sep 17 00:00:00 2001
From: jean-pierre charras <jp.charras@wanadoo.fr>
Date: Tue, 7 Feb 2023 12:53:34 +0100
Subject: [PATCH] pagelayout editor: Add tests for invalid parameters. Invalid
 parameters are repeat count < 1, size < 0 and default size < 0.01 mm

---
 common/drawing_sheet/drawing_sheet_parser.cpp | 13 +++--
 .../dialogs/properties_frame.cpp              | 53 +++++++++++++++----
 .../dialogs/properties_frame_base.cpp         |  5 +-
 .../dialogs/properties_frame_base.fbp         | 21 +++++++-
 .../dialogs/properties_frame_base.h           |  7 +--
 5 files changed, 77 insertions(+), 22 deletions(-)

diff --git a/common/drawing_sheet/drawing_sheet_parser.cpp b/common/drawing_sheet/drawing_sheet_parser.cpp
index 1cdb1e9acc..ebfcf89df8 100644
--- a/common/drawing_sheet/drawing_sheet_parser.cpp
+++ b/common/drawing_sheet/drawing_sheet_parser.cpp
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 1992-2013 Jean-Pierre Charras <jp.charras at wanadoo.fr>.
- * Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
  *
  *
  * This program is free software; you can redistribute it and/or
@@ -113,7 +113,6 @@ private:
     void readPngdata( DS_DATA_ITEM_BITMAP * aItem );
 };
 
-// PCB_PLOT_PARAMS_PARSER
 
 DRAWING_SHEET_PARSER::DRAWING_SHEET_PARSER( const char* aLine,
                                             const wxString& aSource ) :
@@ -233,7 +232,7 @@ void DRAWING_SHEET_PARSER::Parse( DS_DATA_MODEL* aLayout )
 
         case T_polygon:
             item = new DS_DATA_ITEM_POLYGONS();
-            parsePolygon(  (DS_DATA_ITEM_POLYGONS*) item );
+            parsePolygon( (DS_DATA_ITEM_POLYGONS*) item );
             aLayout->Append( item );
             break;
 
@@ -406,7 +405,7 @@ void DRAWING_SHEET_PARSER::parsePolygon( DS_DATA_ITEM_POLYGONS * aItem )
             break;
 
         case T_repeat:
-            aItem->m_RepeatCount = parseInt( -1, 100 );
+            aItem->m_RepeatCount = parseInt( 1, 100 );
             NeedRIGHT();
             break;
 
@@ -483,7 +482,7 @@ void DRAWING_SHEET_PARSER::parseBitmap( DS_DATA_ITEM_BITMAP * aItem )
             break;
 
         case T_repeat:
-            aItem->m_RepeatCount = parseInt( -1, 100 );
+            aItem->m_RepeatCount = parseInt( 1, 100 );
             NeedRIGHT();
             break;
 
@@ -619,7 +618,7 @@ void DRAWING_SHEET_PARSER::parseGraphic( DS_DATA_ITEM * aItem )
             break;
 
         case T_repeat:
-            aItem->m_RepeatCount = parseInt( -1, 100 );
+            aItem->m_RepeatCount = parseInt( 1, 100 );
             NeedRIGHT();
             break;
 
@@ -679,7 +678,7 @@ void DRAWING_SHEET_PARSER::parseText( DS_DATA_ITEM_TEXT* aItem )
             break;
 
         case T_repeat:
-            aItem->m_RepeatCount = parseInt( -1, 100 );
+            aItem->m_RepeatCount = parseInt( 1, 100 );
             NeedRIGHT();
             break;
 
diff --git a/pagelayout_editor/dialogs/properties_frame.cpp b/pagelayout_editor/dialogs/properties_frame.cpp
index 96ad589259..eb5efabaaa 100644
--- a/pagelayout_editor/dialogs/properties_frame.cpp
+++ b/pagelayout_editor/dialogs/properties_frame.cpp
@@ -42,6 +42,11 @@
 #include <dialogs/html_message_box.h>
 
 
+#define DLG_MIN_TEXTSIZE 0.01       // min drawing sheet text default size in mm from PROPERTIES_FRAME
+                                    // Note also 0.0 is allowed for a given text to use the default size
+#define DLG_MAX_TEXTSIZE 100.0      // max drawing sheet text size in mm from PROPERTIES_FRAME
+
+
 PROPERTIES_FRAME::PROPERTIES_FRAME( PL_EDITOR_FRAME* aParent ) :
         PANEL_PROPERTIES_BASE( aParent ),
         m_scintillaTricks( nullptr ),
@@ -175,14 +180,26 @@ bool PROPERTIES_FRAME::CopyPrmsFromPanelToGeneral()
     DS_DATA_MODEL&   model = DS_DATA_MODEL::GetTheInstance();
 
     // Import default parameters from widgets
+    m_defaultLineWidth.Validate( 0.0, 10.0, EDA_UNITS::MILLIMETRES );
     model.m_DefaultLineWidth = EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units,
                                                                m_defaultLineWidth.GetValue() );
 
-    model.m_DefaultTextSize.x = EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units,
-                                                                m_defaultTextSizeX.GetValue() );
-    model.m_DefaultTextSize.y = EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units,
+    bool is_valid = m_defaultTextSizeX.Validate( DLG_MIN_TEXTSIZE, DLG_MAX_TEXTSIZE,
+                                                 EDA_UNITS::MILLIMETRES );
+    if( is_valid )
+        model.m_DefaultTextSize.x = EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units,
+                                                            m_defaultTextSizeX.GetValue() );
+
+    is_valid = m_defaultTextSizeY.Validate( DLG_MIN_TEXTSIZE, DLG_MAX_TEXTSIZE, EDA_UNITS::MILLIMETRES );
+
+    if( is_valid )
+        model.m_DefaultTextSize.y = EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units,
                                                                 m_defaultTextSizeY.GetValue() );
-    model.m_DefaultTextThickness = EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units,
+
+    is_valid = m_defaultTextThickness.Validate( 0.0, 5.0, EDA_UNITS::MILLIMETRES );
+
+    if( is_valid )
+        model.m_DefaultTextThickness = EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units,
                                                                 m_defaultTextThickness.GetValue() );
 
     // Get page margins values
@@ -462,7 +479,10 @@ bool PROPERTIES_FRAME::CopyPrmsFromPanelToItem( DS_DATA_ITEM* aItem )
     }
 
     // Import thickness
-    aItem->m_LineWidth =
+    bool is_valid = m_lineWidth.Validate( 0.0, 10.0, EDA_UNITS::MILLIMETRES );
+
+    if( is_valid )
+        aItem->m_LineWidth =
             EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units, m_lineWidth.GetValue() );
 
     // Import Start point
@@ -497,6 +517,15 @@ bool PROPERTIES_FRAME::CopyPrmsFromPanelToItem( DS_DATA_ITEM* aItem )
     long itmp;
     msg = m_textCtrlRepeatCount->GetValue();
     msg.ToLong( &itmp );
+    // Ensure m_RepeatCount is > 0. Otherwise it create issues because a repeat
+    // count < 1 make no sense
+    if( itmp < 1l )
+    {
+        itmp = 1;
+        msg.Printf( wxT( "%ld" ), itmp );
+        m_textCtrlRepeatCount->SetValue( msg );
+    }
+
     aItem->m_RepeatCount = itmp;
 
     aItem->m_IncrementVector.x =
@@ -539,10 +568,16 @@ bool PROPERTIES_FRAME::CopyPrmsFromPanelToItem( DS_DATA_ITEM* aItem )
         item->m_Orient = EDA_UNIT_UTILS::UI::DoubleValueFromString( drawSheetIUScale, EDA_UNITS::UNSCALED, msg );
 
         // Import text size
-        item->m_TextSize.x =
-                EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units, m_textSizeX.GetValue() );
-        item->m_TextSize.y =
-                EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units, m_textSizeY.GetValue() );
+        is_valid = m_textSizeX.Validate( 0.0, DLG_MAX_TEXTSIZE, EDA_UNITS::MILLIMETRES );
+
+        if( is_valid )
+            item->m_TextSize.x = EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units,
+                                                                 m_textSizeX.GetValue() );
+        is_valid = m_textSizeY.Validate( 0.0, DLG_MAX_TEXTSIZE, EDA_UNITS::MILLIMETRES );
+
+        if( is_valid )
+            item->m_TextSize.y = EDA_UNIT_UTILS::UI::ToUserUnit( drawSheetIUScale, units,
+                                                                 m_textSizeY.GetValue() );
 
         // Import constraints:
         item->m_BoundingBoxSize.x =
diff --git a/pagelayout_editor/dialogs/properties_frame_base.cpp b/pagelayout_editor/dialogs/properties_frame_base.cpp
index 90ed5eeee8..5f3d71ed2e 100644
--- a/pagelayout_editor/dialogs/properties_frame_base.cpp
+++ b/pagelayout_editor/dialogs/properties_frame_base.cpp
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Oct 26 2018)
+// C++ code generated with wxFormBuilder (version 3.10.0-39-g3487c3cb)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -28,7 +28,7 @@ PANEL_PROPERTIES_BASE::PANEL_PROPERTIES_BASE( wxWindow* parent, wxWindowID id, c
 
 	m_staticTextType = new wxStaticText( m_swItemProperties, wxID_ANY, _("Type"), wxDefaultPosition, wxDefaultSize, 0 );
 	m_staticTextType->Wrap( -1 );
-	m_staticTextType->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_SLANT, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+	m_staticTextType->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
 
 	bSizerButt->Add( m_staticTextType, 1, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 4 );
 
@@ -56,6 +56,7 @@ PANEL_PROPERTIES_BASE::PANEL_PROPERTIES_BASE( wxWindow* parent, wxWindowID id, c
 	m_stcText->SetViewWhiteSpace( false );
 	m_stcText->SetMarginWidth( 2, 0 );
 	m_stcText->SetIndentationGuides( false );
+	m_stcText->SetReadOnly( false );
 	m_stcText->SetMarginWidth( 1, 0 );
 	m_stcText->SetMarginWidth( 0, 0 );
 	m_stcText->MarkerDefine( wxSTC_MARKNUM_FOLDER, wxSTC_MARK_BOXPLUS );
diff --git a/pagelayout_editor/dialogs/properties_frame_base.fbp b/pagelayout_editor/dialogs/properties_frame_base.fbp
index 7b562a119f..398764b0af 100644
--- a/pagelayout_editor/dialogs/properties_frame_base.fbp
+++ b/pagelayout_editor/dialogs/properties_frame_base.fbp
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <wxFormBuilder_Project>
-    <FileVersion major="1" minor="15" />
+    <FileVersion major="1" minor="16" />
     <object class="Project" expanded="1">
         <property name="class_decoration"></property>
         <property name="code_generation">C++</property>
@@ -14,6 +14,7 @@
         <property name="file">properties_frame_base</property>
         <property name="first_id">1000</property>
         <property name="help_provider">none</property>
+        <property name="image_path_wrapper_function_name"></property>
         <property name="indent_with_spaces"></property>
         <property name="internationalize">1</property>
         <property name="name">properties_frame_base</property>
@@ -25,6 +26,7 @@
         <property name="skip_php_events">1</property>
         <property name="skip_python_events">1</property>
         <property name="ui_table">UI</property>
+        <property name="use_array_enum">0</property>
         <property name="use_enum">1</property>
         <property name="use_microsoft_bom">0</property>
         <object class="Panel" expanded="1">
@@ -46,6 +48,7 @@
             <property name="size">-1,-1</property>
             <property name="subclass"></property>
             <property name="tooltip"></property>
+            <property name="two_step_creation">0</property>
             <property name="window_extra_style"></property>
             <property name="window_name"></property>
             <property name="window_style">wxTAB_TRAVERSAL</property>
@@ -257,6 +260,7 @@
                                                     <property name="aui_name"></property>
                                                     <property name="aui_position"></property>
                                                     <property name="aui_row"></property>
+                                                    <property name="auth_needed">0</property>
                                                     <property name="best_size"></property>
                                                     <property name="bg"></property>
                                                     <property name="bitmap"></property>
@@ -442,6 +446,7 @@
                                                     <property name="permission">protected</property>
                                                     <property name="pin_button">1</property>
                                                     <property name="pos"></property>
+                                                    <property name="read_only">0</property>
                                                     <property name="resize">Resizable</property>
                                                     <property name="show">1</property>
                                                     <property name="size"></property>
@@ -507,6 +512,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -579,6 +585,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -651,6 +658,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -723,6 +731,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -795,6 +804,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -867,6 +877,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -939,6 +950,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -1011,6 +1023,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -1083,6 +1096,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -1155,6 +1169,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -1227,6 +1242,7 @@
                                                                             <property name="aui_name"></property>
                                                                             <property name="aui_position"></property>
                                                                             <property name="aui_row"></property>
+                                                                            <property name="auth_needed">0</property>
                                                                             <property name="best_size"></property>
                                                                             <property name="bg"></property>
                                                                             <property name="bitmap"></property>
@@ -4786,6 +4802,7 @@
                                             <property name="aui_name"></property>
                                             <property name="aui_position"></property>
                                             <property name="aui_row"></property>
+                                            <property name="auth_needed">0</property>
                                             <property name="best_size"></property>
                                             <property name="bg"></property>
                                             <property name="bitmap"></property>
@@ -5748,6 +5765,7 @@
                                                     <property name="aui_name"></property>
                                                     <property name="aui_position"></property>
                                                     <property name="aui_row"></property>
+                                                    <property name="auth_needed">0</property>
                                                     <property name="best_size"></property>
                                                     <property name="bg"></property>
                                                     <property name="bitmap"></property>
@@ -6637,6 +6655,7 @@
                                                     <property name="aui_name"></property>
                                                     <property name="aui_position"></property>
                                                     <property name="aui_row"></property>
+                                                    <property name="auth_needed">0</property>
                                                     <property name="best_size"></property>
                                                     <property name="bg"></property>
                                                     <property name="bitmap"></property>
diff --git a/pagelayout_editor/dialogs/properties_frame_base.h b/pagelayout_editor/dialogs/properties_frame_base.h
index 6efd54e350..df0d875087 100644
--- a/pagelayout_editor/dialogs/properties_frame_base.h
+++ b/pagelayout_editor/dialogs/properties_frame_base.h
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Oct 26 2018)
+// C++ code generated with wxFormBuilder (version 3.10.0-39-g3487c3cb)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -20,10 +20,10 @@ class FONT_CHOICE;
 #include <wx/font.h>
 #include <wx/colour.h>
 #include <wx/settings.h>
+#include <wx/button.h>
 #include <wx/bitmap.h>
 #include <wx/image.h>
 #include <wx/icon.h>
-#include <wx/button.h>
 #include <wx/choice.h>
 #include <wx/sizer.h>
 #include <wx/stc/stc.h>
@@ -148,7 +148,7 @@ class PANEL_PROPERTIES_BASE : public wxPanel
 		wxStaticText* m_bottomMarginUnits;
 		wxButton* m_buttonGeneralOptsOK;
 
-		// Virtual event handlers, overide them in your derived class
+		// Virtual event handlers, override them in your derived class
 		virtual void OnPageChanged( wxNotebookEvent& event ) { event.Skip(); }
 		virtual void onHelp( wxCommandEvent& event ) { event.Skip(); }
 		virtual void OnAcceptPrms( wxCommandEvent& event ) { event.Skip(); }
@@ -158,6 +158,7 @@ class PANEL_PROPERTIES_BASE : public wxPanel
 	public:
 
 		PANEL_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
 		~PANEL_PROPERTIES_BASE();
 
 };