]> git.deb.at Git - pkg/abook.git/blobdiff - ui.c
Updated JH's e-mail address
[pkg/abook.git] / ui.c
diff --git a/ui.c b/ui.c
index 3286d21b4402a7b52a1b0482ee5c7b44b337bd78..d27fa7360f6af4a0487c8cdde7722e5279d62701 100644 (file)
--- a/ui.c
+++ b/ui.c
@@ -2,7 +2,7 @@
 /*
  * $Id$
  *
- * by JH <jheinonen@bigfoot.com>
+ * by JH <jheinonen@users.sourceforge.net>
  *
  * Copyright (C) Jaakko Heinonen
  */
@@ -13,6 +13,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <signal.h>
+#include <ctype.h>
 #include "abook.h"
 #include "ui.h"
 #include "edit.h"
 #      include <sys/ioctl.h>
 #endif
 
-#ifdef USE_ASCII_ONLY
-#      define UI_HLINE_CHAR            '-'
-#else
-#      define UI_HLINE_CHAR            ACS_HLINE
-#endif
-
-
 /*
  * external variables
  */
@@ -130,14 +124,22 @@ is_ui_initialized()
        return ui_initialized;
 }
 
-
-int
-init_ui()
+void
+ui_init_curses()
 {
-       initscr(); cbreak(); noecho();
+       if(!is_ui_initialized())
+               initscr();
+       cbreak();
+       noecho();
        nonl();
        intrflush(stdscr, FALSE);
        keypad(stdscr, TRUE);
+}
+
+int
+init_ui()
+{
+       ui_init_curses();
 #ifdef DEBUG
         fprintf(stderr, "init_abook():\n");
         fprintf(stderr, "  COLS = %d, LINES = %d\n", COLS, LINES);
@@ -278,6 +280,34 @@ statusline_getnstr(char *str, int n, int use_filesel)
        return buf;
 }
 
+int
+statusline_ask_boolean(char *msg, int def)
+{
+       int ret;
+       char *msg2 = strconcat(msg,  def ? " (Y/n)?" : " (y/N)?", NULL);
+                       
+       statusline_addstr(msg2);
+
+       free(msg2);
+
+       switch( tolower(getch()) ) {
+               case 'n':
+                       ret = FALSE;
+                       break;
+               case 'y':
+                       ret = TRUE;
+                       break;
+               default:
+                       ret = def;
+                       break;
+       }
+
+       clear_statusline();
+
+       return ret;
+}
+
+
 void
 refresh_statusline()
 {
@@ -315,12 +345,10 @@ clear_statusline()
        refresh();
 }
 
-
 /*
- * help - need to rewrite
+ * help
  */
 
-
 #include "help.h"
 
 void
@@ -360,7 +388,6 @@ display_help(int help)
        delwin(helpw);
 }
 
-
 /*
  * end of help
  */
@@ -443,11 +470,16 @@ get_commands()
                        case 'Z': move_curitem(MOVE_ITEM_DOWN);
                                break;
 
-                       case 'm': launch_mutt(); break;
+                       case 'm': launch_mutt(selected_items() ?
+                                                 -1 : list_current_item());
+                                 refresh_screen();
+                                 break;
 
                        case 'p': ui_print_database(); break;
 
-                       case 'u': launch_lynx(); break;
+                       case 'u': launch_wwwbrowser(list_current_item());
+                                 refresh_screen();
+                                 break;
                }
        }
 }
@@ -456,20 +488,11 @@ get_commands()
 void
 ui_remove_items()
 {
-       if( items < 1 || curitem < 0 )
+       if(list_is_empty())
                return;
 
-       statusline_addstr("Remove selected item(s) (Y/n)");
-       switch( getch() ) {
-               case '\r':
-               case 'y':
-               case 'Y': break;
-               default:
-                         clear_statusline();
-                         return;
-       }
-
-       remove_selected_items();
+       if(statusline_ask_boolean("Remove selected item(s)", TRUE))
+               remove_selected_items();
 
        clear_statusline();     
        refresh_list();
@@ -478,26 +501,18 @@ ui_remove_items()
 void
 ui_clear_database()
 {
-
-       statusline_addstr("Clear WHOLE database (y/N)");
-       switch( getch() ) {
-               case 'y':
-               case 'Y': break;
-               default:
-                       clear_statusline();
-                       return;
+       if(statusline_ask_boolean("Clear WHOLE database", FALSE)) {
+               close_database();
+               refresh_list();
        }
-
-       close_database();
-
-       refresh_screen();
 }
 
 void
 ui_find(int next)
 {
        int item;
-       static char findstr[81];
+       static char findstr[MAX_FIELD_LEN];
+       int search_fields[] = {NAME, EMAIL, NICK, -1};
 
        if(next) {
                if( !*findstr )
@@ -505,11 +520,12 @@ ui_find(int next)
        } else {
                clear_statusline();
                statusline_addstr("/");
-               statusline_getnstr(findstr, 67, 0);
+               statusline_getnstr(findstr, MAX_FIELD_LEN - 1, 0);
                clear_statusline();
        }
 
-       if( (item = find_item(findstr, next ? curitem+1 : curitem)) >= 0 ) {
+       if( (item = find_item(findstr, curitem + !!next,
+                                       search_fields )) >= 0 ) {
                curitem = item;
                refresh_list();
        }
@@ -530,16 +546,10 @@ ui_print_number_of_items()
 void
 ui_read_database()
 {
-       if(items > 0) {
-               statusline_addstr("Your current data will be lost - Press 'y' to continue");
-               switch( getch() ) {
-                       case 'y':
-                       case 'Y': break;
-                       default: clear_statusline();
-                                return;
-               }
-               clear_statusline();
-       }
+       if(items > 0)
+               if(!statusline_ask_boolean("Your current data will be lost - "
+                               "Press 'y' to continue", FALSE))
+                       return;
 
        load_database(datafile);
        refresh_list();
@@ -551,20 +561,35 @@ ui_print_database()
 {
        FILE *handle;
        char *command = options_get_str("print_command");
+       int mode;
 
-       statusline_addstr("Print addressbook? (y/N)");
-       switch( getch() ) {
-               case 'y':
-               case 'Y':
+       if( list_is_empty() )
+               return;
+
+       statusline_addstr("Print All/Selected/Cancel (a/s/C)?");
+
+       switch( tolower(getch()) ) {
+               case 'a':
+                       mode = ENUM_ALL;
                        break;
-               default: clear_statusline(); return;
+               case 's':
+                       if( !selected_items() ) {
+                               statusline_msg("No selected items");
+                               return;
+                       }
+                       mode = ENUM_SELECTED;
+                       break;
+               default:
+                       clear_statusline();
+                       return;
        }
+
        clear_statusline();
 
        if( ! *command || (handle = popen(command, "w")) == NULL)
                return;
 
-       fexport("text", handle);
+       fexport("text", handle, mode);
        
        pclose(handle);
 }
@@ -584,15 +609,8 @@ ui_open_datafile()
 
        if( options_get_int("autosave") )
                save_database();
-       else {
-               statusline_addstr("Save current database (y/N)");
-               switch( getch() ) {
-                       case 'y':
-                       case 'Y':
-                               save_database();
-                       default: break;
-               }
-       }
+       else if(statusline_ask_boolean("Save current database", FALSE))
+               save_database();
 
        close_database();