From 7d4ef08345d51e59b045c3d8415a4f15bd758d3c Mon Sep 17 00:00:00 2001
From: Baptiste Jonglez <baptiste--git@jonglez.org>
Date: Sun, 13 May 2012 14:09:20 +0200
Subject: Use status_ask_choice() on more difficult cases

These cases are also candidates for the factorisation process, but
they are somewhat more tricky to get right.

Since we use a completely different approach, the result (from a user
perspective) looks different.

Signed-off-by: Baptiste Jonglez <baptiste--git@jonglez.org>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
---
 src/day.c   | 80 ++++++++++++++++++++++++++++++++++++++++++++-----------------
 src/recur.c | 45 +++++++++++++++++++++-------------
 2 files changed, 87 insertions(+), 38 deletions(-)

diff --git a/src/day.c b/src/day.c
index 8b7e87d..d74283f 100644
--- a/src/day.c
+++ b/src/day.c
@@ -694,14 +694,50 @@ update_desc (char **desc)
 static void
 update_rept (struct rpt **rpt, const long start)
 {
-  const int SINGLECHAR = 2;
-  int ch, newfreq, date_entered;
+  int newtype, newfreq, date_entered;
   long newuntil;
   char outstr[BUFSIZ];
-  char *typstr, *freqstr, *timstr;
-  const char *msg_rpt_type = _("Enter the new repetition type: (D)aily, (W)eekly, "
-                         "(M)onthly, (Y)early");
-  const char *msg_rpt_ans = _("[D/W/M/Y] ");
+  char *freqstr, *timstr;
+  const char *msg_rpt_prefix = _("Enter the new repetition type:");
+  const char *msg_rpt_daily = _("(d)aily");
+  const char *msg_rpt_weekly = _("(w)eekly");
+  const char *msg_rpt_monthly = _("(m)onthly");
+  const char *msg_rpt_yearly = _("(y)early");
+
+  /* Find the current repetition type. */
+  const char *rpt_current;
+  char msg_rpt_current[BUFSIZ];
+  switch (recur_def2char ((*rpt)->type))
+    {
+    case 'D':
+      rpt_current = msg_rpt_daily;
+      break;
+    case 'W':
+      rpt_current = msg_rpt_weekly;
+      break;
+    case 'M':
+      rpt_current = msg_rpt_monthly;
+      break;
+    case 'Y':
+      rpt_current = msg_rpt_yearly;
+      break;
+    default:
+      /* NOTREACHED, but makes the compiler happier. */
+      rpt_current = msg_rpt_daily;
+    }
+
+  snprintf (msg_rpt_current, BUFSIZ, _("(currently using %s)"), rpt_current);
+
+  char msg_rpt_asktype[BUFSIZ];
+  snprintf (msg_rpt_asktype, BUFSIZ, "%s %s, %s, %s, %s ? %s",
+            msg_rpt_prefix,
+            msg_rpt_daily,
+            msg_rpt_weekly,
+            msg_rpt_monthly,
+            msg_rpt_yearly,
+            msg_rpt_current);
+
+  const char *msg_rpt_choice = _("[dwmy]");
   const char *msg_wrong_freq = _("The frequence you entered is not valid.");
   const char *msg_wrong_time = _("Invalid time: start time must be before end time!");
   const char *msg_wrong_date = _("The entered date is not valid.");
@@ -709,23 +745,23 @@ update_rept (struct rpt **rpt, const long start)
     "Possible formats are [%s] or '0' for an endless repetetition";
   const char *msg_enter = _("Press [Enter] to continue");
 
-  do
+  switch (status_ask_choice (msg_rpt_asktype, msg_rpt_choice, 4))
     {
-      status_mesg (msg_rpt_type, msg_rpt_ans);
-      typstr = mem_calloc (SINGLECHAR, sizeof (char));
-      snprintf (typstr, SINGLECHAR, "%c", recur_def2char ((*rpt)->type));
-      if (updatestring (win[STA].p, &typstr, 0, 1) == GETSTRING_VALID)
-        {
-          ch = toupper (*typstr);
-          mem_free (typstr);
-        }
-      else
-        {
-          mem_free (typstr);
-          return;
-        }
+    case 1:
+      newtype = 'D';
+      break;
+    case 2:
+      newtype = 'W';
+      break;
+    case 3:
+      newtype = 'M';
+      break;
+    case 4:
+      newtype = 'Y';
+      break;
+    default:
+      return;
     }
-  while ((ch != 'D') && (ch != 'W') && (ch != 'M') && (ch != 'Y'));
 
   do
     {
@@ -805,7 +841,7 @@ update_rept (struct rpt **rpt, const long start)
   while (date_entered == 0);
 
   mem_free (timstr);
-  (*rpt)->type = recur_char2def (ch);
+  (*rpt)->type = recur_char2def (newtype);
   (*rpt)->freq = newfreq;
   (*rpt)->until = newuntil;
 }
diff --git a/src/recur.c b/src/recur.c
index bf18d55..d1a5516 100644
--- a/src/recur.c
+++ b/src/recur.c
@@ -868,15 +868,17 @@ recur_repeat_item (void)
 {
   struct tm *lt;
   time_t t;
-  int ch = 0;
   int date_entered = 0;
   int year = 0, month = 0, day = 0;
   struct date until_date;
   char outstr[BUFSIZ];
   char user_input[BUFSIZ] = "";
-  const char *mesg_type_1 =
-    _("Enter the repetition type: (D)aily, (W)eekly, (M)onthly, (Y)early");
-  const char *mesg_type_2 = _("[D/W/M/Y] ");
+  const char *msg_rpt_prefix = _("Enter the repetition type:");
+  const char *msg_rpt_daily = _("(d)aily");
+  const char *msg_rpt_weekly = _("(w)eekly");
+  const char *msg_rpt_monthly = _("(m)onthly");
+  const char *msg_rpt_yearly = _("(y)early");
+  const char *msg_type_choice = _("[dwmy]");
   const char *mesg_freq_1 = _("Enter the repetition frequence:");
   const char *mesg_wrong_freq = _("The frequence you entered is not valid.");
   const char *mesg_until_1 =
@@ -888,6 +890,15 @@ recur_repeat_item (void)
   const char *wrong_type_2 = _("Press [ENTER] to continue.");
   const char *mesg_older =
     _("Sorry, the date you entered is older than the item start time.");
+
+  char msg_asktype[BUFSIZ];
+    snprintf (msg_asktype, BUFSIZ, "%s %s, %s, %s, %s",
+              msg_rpt_prefix,
+              msg_rpt_daily,
+              msg_rpt_weekly,
+              msg_rpt_monthly,
+              msg_rpt_yearly);
+
   int type = 0, freq = 0;
   int item_nb;
   struct day_item *p;
@@ -903,21 +914,23 @@ recur_repeat_item (void)
       return;
     }
 
-  while ((ch != 'D') && (ch != 'W') && (ch != 'M')
-         && (ch != 'Y') && (ch != ESCAPE))
-    {
-      status_mesg (mesg_type_1, mesg_type_2);
-      ch = wgetch (win[STA].p);
-      ch = toupper (ch);
-    }
-  if (ch == ESCAPE)
+  switch (status_ask_choice (msg_asktype, msg_type_choice, 4))
     {
+    case 1:
+      type = RECUR_DAILY;
+      break;
+    case 2:
+      type = RECUR_WEEKLY;
+      break;
+    case 3:
+      type = RECUR_MONTHLY;
+      break;
+    case 4:
+      type = RECUR_YEARLY;
+      break;
+    default:
       return;
     }
-  else
-    {
-      type = recur_char2def (ch);
-    }
 
   while (freq == 0)
     {
-- 
cgit v1.2.3-70-g09d2