lmi
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [lmi] Input-sequence editor testing


From: Vaclav Slavik
Subject: Re: [lmi] Input-sequence editor testing
Date: Mon, 21 Mar 2011 11:11:47 +0100
User-agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.15) Gecko/20110303 Thunderbird/3.1.9

Hi,

On 2011-03-20 14:25, Greg Chicares wrote:
> Until this month, I had applied the first four of those five patches
> in chronological order against lmi HEAD, successfully. Now I'm trying
> to apply the fifth--the most recent--and I must be doing something
> wrong because "5 out of 16 hunks FAILED". 

Sorry about that, I lost track of the patches a bit, apparently.
Here's a version that should apply cleanly to your tree (on top of all
the previous ones):


diff --git a/input_sequence_entry.cpp b/input_sequence_entry.cpp
index c1f93e4..326d40d 100644
--- a/input_sequence_entry.cpp
+++ b/input_sequence_entry.cpp
@@ -43,6 +43,7 @@
 #include <wx/combobox.h>
 #include <wx/dialog.h>
 #include <wx/sizer.h>
+#include <wx/spinctrl.h>
 #include <wx/stattext.h>
 #include <wx/textctrl.h>
 #include <wx/valtext.h>
@@ -234,9 +235,9 @@ class InputSequenceEditor
         return get_field<DurationModeChoice>(Col_DurationMode, row);
     }
 
-    wxTextCtrl& duration_num_field(int row)
+    wxSpinCtrl& duration_num_field(int row)
     {
-        return get_field<wxTextCtrl>(Col_DurationNum, row);
+        return get_field<wxSpinCtrl>(Col_DurationNum, row);
     }
 
     wxStaticText& then_field(int row)
@@ -260,6 +261,7 @@ class InputSequenceEditor
 
     int compute_duration_scalar(int row);
     void adjust_duration_num(int row);
+    void adjust_duration_num_range(int row);
 
     void update_diagnostics();
     bool is_valid_value(wxString const& s);
@@ -357,7 +359,7 @@ void InputSequenceEditor::sequence(InputSequence const& s)
 
         duration_mode_field(i).value(data.end_mode);
 
-        int dur_num;
+        int dur_num = 0;
         switch(data.end_mode)
             {
             case e_number_of_years:
@@ -382,7 +384,7 @@ void InputSequenceEditor::sequence(InputSequence const& s)
                 }
             }
 
-        
duration_num_field(i).SetValue(value_cast<std::string>(dur_num).c_str());
+        duration_num_field(i).SetValue(dur_num);
 
         if(data.value_is_keyword)
             {
@@ -423,19 +425,19 @@ std::string InputSequenceEditor::sequence_string()
             case e_attained_age:
                 {
                 s.append(" @");
-                s.append(duration_num_field(i).GetValue().c_str());
+                
s.append(value_cast<std::string>(duration_num_field(i).GetValue()));
                 break;
                 }
             case e_duration:
                 {
                 s.append(" ");
-                s.append(duration_num_field(i).GetValue().c_str());
+                
s.append(value_cast<std::string>(duration_num_field(i).GetValue()));
                 break;
                 }
             case e_number_of_years:
                 {
                 s.append(" #");
-                s.append(duration_num_field(i).GetValue().c_str());
+                
s.append(value_cast<std::string>(duration_num_field(i).GetValue()));
                 break;
                 }
             case e_maturity:
@@ -530,10 +532,9 @@ void InputSequenceEditor::insert_row(int new_row)
     sizer_->wxSizer::Insert(insert_pos++, from_label, flags);
     wxChoice *duration_mode = new(wx) DurationModeChoice(this);
     sizer_->wxSizer::Insert(insert_pos++, duration_mode, flags);
-    wxTextCtrl* duration_num = new(wx) wxTextCtrl(this, wxID_ANY, "", 
wxDefaultPosition, wxDefaultSize, wxTE_RIGHT);
-    duration_num->SetValidator(wxTextValidator(wxFILTER_DIGITS));
+    wxSpinCtrl* duration_num = new(wx) wxSpinCtrl(this, wxID_ANY, "");
     sizer_->wxSizer::Insert(insert_pos++, duration_num, flags);
-    SizeWinForText(duration_num, "999", 20);
+    SizeWinForText(duration_num, "9999", 20);
     wxStaticText* then_label = new(wx) wxStaticText(this, wxID_ANY, 
LARGEST_THEN_TEXT);
     sizer_->wxSizer::Insert(insert_pos++, then_label, flags);
     SizeWinForText(then_label, LARGEST_THEN_TEXT);
@@ -631,7 +632,7 @@ void InputSequenceEditor::insert_row(int new_row)
         );
     ::Connect
         (duration_num
-        ,wxEVT_COMMAND_TEXT_UPDATED
+        ,wxEVT_COMMAND_SPINCTRL_UPDATED
         ,&InputSequenceEditor::UponDurationNumChange
         ,wxID_ANY
         ,this
@@ -745,8 +746,9 @@ void InputSequenceEditor::update_row(int row)
     // "maturity" should be an option only on the last row:
     duration_mode_field(row).allow_maturity(is_last_row);
 
-    // duration number visibility:
+    // duration number visibility and range:
     duration_num_field(row).Show(duration_mode_field(row).needs_number());
+    adjust_duration_num_range(row);
 
     if(duration_mode_field(row).value() == e_number_of_years)
         {
@@ -796,13 +798,10 @@ wxString InputSequenceEditor::format_from_text(int row)
         }
 
     duration_mode mode = duration_mode_field(row - 1).value();
-    long num = 0;
+    int num = 0;
     if(duration_mode_field(row - 1).needs_number())
         {
-        if(!duration_num_field(row - 1).GetValue().ToLong(&num))
-            {
-            return "";
-            }
+        num = duration_num_field(row - 1).GetValue();
         }
 
     switch(mode)
@@ -813,25 +812,24 @@ wxString InputSequenceEditor::format_from_text(int row)
             }
         case e_attained_age:
             {
-            return wxString::Format("from age %ld", num);
+            return wxString::Format("from age %d", num);
             }
         case e_duration:
             {
-            return wxString::Format("from duration %ld", num);
+            return wxString::Format("from duration %d", num);
             }
         case e_number_of_years:
             {
-            long yrs = 0;
+            int yrs = 0;
             int i = row - 1;
             while(0 <= i && duration_mode_field(i).value() == 
e_number_of_years)
                 {
-                long num_i = 0;
-                duration_num_field(i).GetValue().ToLong(&num_i);
+                int num_i = duration_num_field(i).GetValue();
                 yrs += num_i;
                 i--;
                 }
             return wxString::Format
-                ("%s + %ld years",
+                ("%s + %d years",
                 format_from_text(i + 1).c_str(),
                 yrs
                 );
@@ -870,17 +868,7 @@ T& InputSequenceEditor::get_field(int col, int row)
 
 int InputSequenceEditor::compute_duration_scalar(int row)
 {
-    long duration_num = -1;
-    wxString const duration_num_str = duration_num_field(row).GetValue();
-    if(duration_num_str.empty())
-        {
-        duration_num = 0;
-        }
-    else
-        {
-        duration_num_str.ToLong(&duration_num);
-        }
-    LMI_ASSERT(-1 != duration_num);
+    int duration_num = duration_num_field(row).GetValue();
 
     switch(duration_mode_field(row).value())
         {
@@ -923,6 +911,43 @@ int InputSequenceEditor::compute_duration_scalar(int row)
     throw "Unreachable--silences a compiler diagnostic.";
 }
 
+void InputSequenceEditor::adjust_duration_num_range(int row)
+{
+    if(!duration_mode_field(row).needs_number())
+        return;
+
+    int const prev_duration = (row > 0) ? duration_scalars_[row - 1] : 0;
+    wxSpinCtrl& duration = duration_num_field(row);
+
+    switch(duration_mode_field(row).value())
+        {
+        case e_attained_age:
+            {
+            duration.SetRange(input_.issue_age() + 1 + prev_duration, 
input_.maturity_age() - 1);
+            break;
+            }
+        case e_duration:
+            {
+            duration.SetRange(1 + prev_duration, input_.years_to_maturity() - 
1);
+            break;
+            }
+        case e_number_of_years:
+            {
+            duration.SetRange(1, input_.years_to_maturity() - prev_duration - 
1);
+            break;
+            }
+        case e_maturity:
+        case e_retirement:
+        case e_invalid_mode:
+        case e_inception:
+        case e_inforce:
+            {
+            fatal_error() << "unexpected duration_mode value" << LMI_FLUSH;
+            break;
+            }
+        }
+}
+
 void InputSequenceEditor::adjust_duration_num(int row)
 {
     int const scalar = duration_scalars_[row];
@@ -963,7 +988,9 @@ void InputSequenceEditor::adjust_duration_num(int row)
             }
         }
 
-    duration_num_field(row).SetValue(wxString::Format("%d", num));
+    adjust_duration_num_range(row);
+
+    duration_num_field(row).SetValue(num);
 }
 
 void InputSequenceEditor::update_diagnostics()
@@ -1009,9 +1036,6 @@ wxString InputSequenceEditor::get_diagnostics_message()
 
         if(!is_valid_value(value))
             return wxString::Format("Invalid keyword \"%s\" on row %d.", 
value.c_str(), row);
-
-        if(duration_mode_field(row).needs_number() && 
duration_num_field(row).GetValue().empty())
-            return wxString::Format("Duration not entered on row %d.", row);
         }
 
     // As fallback, parse the sequence and check the diagnostics. This may be
@@ -1026,7 +1050,10 @@ wxString InputSequenceEditor::get_diagnostics_message()
         ,0
         ,keywords_
         );
-    return sequence.formatted_diagnostics().c_str();
+    wxString msg = sequence.formatted_diagnostics().c_str();
+    // formatted_diagnostics() returns newline-terminated string, fix it:
+    msg.Trim();
+    return msg;
 }
 
 void InputSequenceEditor::UponValueChange(wxCommandEvent&)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]