[Top][All Lists]
[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&)