00001
00010 #include <gtk/gtk.h>
00011 #include<stdio.h>
00012 #include <stdlib.h>
00013 #include <string.h>
00014 #include <gdk/gdkkeysyms.h>
00015 #include<sqlite3.h>
00016
00017
00018 GtkWidget *btn_new, *btn_edit, *btn_delete;
00019 GtkWidget *add_window,*edit_window;
00020 GtkWidget *entry_name,*entry_email,*edit_entry_name,*edit_entry_email;
00021 GtkWidget *combo_date,*combo_month,*combo_year,*edit_combo_date,*edit_combo_month,*edit_combo_year;
00022 GtkWidget *spin_pdays, *spin_adays;
00023
00024
00025 gchar *clicked_name, *clicked_dob, *clicked_email, *replaced_name, *mail_clicked_email;
00026 int day_in_advance;
00027 int day_after_event;
00028 int flag_listwindow;
00029 int startup;
00030
00031
00032
00033 static GtkWidget* create_view();
00034 static GtkTreeModel* create_model();
00035 void fill_model (GtkTreeModel* , char*, char*, char*);
00036
00037 void callback_action_add(GtkWidget *, GtkTreeView *);
00038 void callback_add_record(GtkWidget*, GtkTreeView*);
00039
00040 void callback_action_edit(GtkWidget *, GtkTreeView *);
00041 void callback_edit_record(GtkWidget*, GtkTreeView*);
00042
00043 void callback_action_delete(GtkWidget*, GtkTreeView*);
00044
00045 void window_destroy (GtkWidget *, gpointer);
00046
00047 int row_selected(GtkTreeView*);
00048 void callback_rowselected(GtkTreeView *, GtkTreePath *, GtkTreeViewColumn *, gpointer);
00049
00050 int callback_generate(GtkWidget* btn, gpointer data);
00051 static int callback_csv (void *NotUsed, int argc, char **argv, char **azColName);
00052 int callback_upload (GtkWidget*, GtkTreeView*);
00053 void callback_email (GtkWidget *, GtkTreeView*);
00054 int mail_row_selected(GtkTreeView*);
00055
00056
00057 int listwindow();
00058 void callback_quit(GtkWidget *, gpointer);
00059 void exit_program(GtkWidget *, gpointer);
00060
00061 static GtkWidget* create_second_view();
00062 static GtkTreeModel* create_second_model();
00063 void fill_second_model (GtkTreeModel* , char*, char*);
00064
00065 void main_window_destroy (GtkWidget *, gpointer);
00066 void parameters(int , int , int);
00067 int ReadParameters();
00068 static int callback_parameters (void *, int , char **, char **);
00069 void check_button_callback (GtkWidget *, gpointer);
00070
00071
00072
00073 int AddRecords(char*, char*, char*);
00074 int EditRecords(char*, char*, char*, char*);
00075 int DeleteRecords(char*);
00076 int ReadRecords();
00077
00078
00079 static int sql_callback (void*, int, char **, char **);
00080 int con_to_sql(char*);
00081
00082 int LoadRecords(GtkTreeModel *);
00083 static int sql_callback_load (void*, int, char **, char **);
00084 int load_sql(GtkTreeModel *, char*, int);
00085
00092 int AddRecords(char *name, char*bdate, char* eid)
00093 {
00094 char qry[1024];
00095
00096 bzero(qry,1024);
00097 sprintf(qry , "insert into birthday_tbl values ('%s', '%s', '%s')", name, bdate, eid);
00098 con_to_sql(qry);
00099
00100
00101
00102 return(0);
00103 }
00104
00112 int EditRecords(char* oname, char* name, char* bdate, char* eid)
00113 {
00114
00115 char qry[1024];
00116
00117 bzero(qry,1024);
00118
00119 sprintf(qry , "update birthday_tbl set name = '%s', birth_date = '%s', email_id = '%s' where name = '%s'", name, bdate, eid, oname);
00120
00121 con_to_sql(qry);
00122
00123
00124
00125 return(0);
00126 }
00127
00132 int DeleteRecords(char* name)
00133 {
00134 char qry[1024];
00135
00136 bzero(qry,1024);
00137 sprintf(qry , "delete from birthday_tbl where name = '%s'", name);
00138 con_to_sql(qry);
00139
00140
00141
00142 return(0);
00143 }
00144
00149 int ReadRecords(GtkTreeModel *second_model)
00150 {
00151 char qry[1024];
00152
00153 strcpy(qry , "select * from birthday_tbl order by name");
00154
00155 load_sql(second_model, qry, 1);
00156
00157 return(0);
00158 }
00159
00164 int isLeapYear(int year)
00165 {
00166 if(year%400 ==0 || (year%100 != 0 && year%4 == 0))
00167 {
00168
00169 return 1;
00170 }
00171 else
00172 {
00173
00174 return 0;
00175 }
00176 }
00177
00185 static int sql_callback (void *second_model, int argc, char **argv, char **azColName)
00186 {
00187
00188 time_t ticks;
00189 struct tm * timeinfo;
00190
00191 char sysdaystr[10], sysyy[10], str[500], email[500];
00192 char *pch, mm[10], dd[10], yy[10];
00193 int sys_day_of_year, sysyear, month, day, year, birth_day_of_year, count=0, difference, backdiff;
00194 const int DaysInMonth[13] = {0,0,31,59,90,120,151,181,212,243,273,304,334};
00195
00196 strcpy(str,"empty");
00197 strcpy(email,"empty");
00198
00199 time ( &ticks );
00200 timeinfo = localtime ( &ticks );
00201
00202
00203
00204
00205
00206
00207
00208
00209 strftime (sysyy, 10, "%Y", timeinfo);
00210 sysyear = atoi(sysyy);
00211
00212 strftime (sysdaystr, 10, "%j", timeinfo);
00213 sys_day_of_year = atoi(sysdaystr);
00214
00215 pch = strtok (argv[1],"-");
00216 while (pch != NULL)
00217 {
00218 if(count == 0)
00219 {
00220 strcpy(mm,pch);
00221 }
00222 if(count == 1)
00223 {
00224 strcpy(dd,pch);
00225 }
00226 if(count == 2)
00227 {
00228 strcpy(yy,pch);
00229 }
00230 pch = strtok (NULL, "-");
00231 count++;
00232 }
00233
00234 month = atoi(mm);
00235 day = atoi(dd);
00236 year = atoi(yy);
00237
00238 birth_day_of_year = DaysInMonth[month] + day;
00239
00240 if(isLeapYear(sysyear))
00241 {
00242 if(month > 2)
00243 {
00244 birth_day_of_year++;
00245 }
00246 }
00247
00248 if(sys_day_of_year > birth_day_of_year)
00249 {
00250 if(isLeapYear(sysyear + 1))
00251 {
00252 if(month > 2)
00253 {
00254 birth_day_of_year++;
00255 }
00256 }
00257
00258 if(isLeapYear(sysyear))
00259 {
00260 difference = 366 - sys_day_of_year + birth_day_of_year;
00261 if( difference <= day_in_advance)
00262 {
00263 if(difference == 0)
00264 {
00265 sprintf(str, "It's %s's %d BirthDay Today!", argv[0], sysyear+1-year);
00266 sprintf(email, "%s", argv[2]);
00267 }
00268 else
00269 {
00270 sprintf(str, "It's %s's BirthDay in %d day%s.", argv[0], difference, (difference>1?"s":""));
00271 sprintf(email, "%s", argv[2]);
00272 }
00273 }
00274 }
00275 else
00276 {
00277 difference = 365 - sys_day_of_year + birth_day_of_year;
00278 if( difference <= day_in_advance)
00279 {
00280 if(difference == 0)
00281 {
00282 sprintf(str, "It's %s's %d BirthDay Today!", argv[0], sysyear+1-year);
00283 sprintf(email, "%s", argv[2]);
00284 }
00285 else
00286 {
00287 sprintf(str, "It's %s's BirthDay in %d day%s.", argv[0], difference, (difference>1?"s":""));
00288 sprintf(email, "%s", argv[2]);
00289 }
00290 }
00291 }
00292
00293 backdiff = sys_day_of_year - birth_day_of_year;
00294 if((backdiff != 0) && (backdiff <= day_after_event))
00295 {
00296 sprintf(str, "It was %s's BirthDay %d day%s ago.", argv[0], backdiff, (backdiff>1?"s":""));
00297 sprintf(email, "%s", argv[2]);
00298 }
00299
00300 }
00301 else
00302 {
00303 difference = birth_day_of_year - sys_day_of_year;
00304 if(difference <= day_in_advance)
00305 {
00306 if(difference == 0)
00307 {
00308 sprintf(str, "It's %s's %d BirthDay Today!", argv[0], sysyear-year);
00309 sprintf(email, "%s", argv[2]);
00310 }
00311 else
00312 {
00313 sprintf(str, "It's %s's BirthDay in %d day%s.", argv[0], difference, (difference>1?"s":""));
00314 sprintf(email, "%s", argv[2]);
00315 }
00316 }
00317 }
00318
00319 if(strcmp(str,"empty"))
00320 {
00321 fill_second_model(GTK_TREE_MODEL(second_model), str, email);
00322 flag_listwindow = 1;
00323 }
00324
00325 return 0;
00326 }
00327
00332 int con_to_sql(char *qry)
00333 {
00334 sqlite3 *db;
00335 char *zErrMsg = 0;
00336 int rc;
00337
00338 rc = sqlite3_open ("Birthday", &db);
00339 if (rc)
00340 {
00341
00342 sqlite3_close (db);
00343 exit (1);
00344 }
00345 rc = sqlite3_exec (db, qry, sql_callback, 0, &zErrMsg);
00346 if (rc != SQLITE_OK)
00347 {
00348
00349 if(rc == 19)
00350 {
00351 GtkWidget *dialog;
00352 gint response;
00353
00354 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "A Record with name %s already exists! Do you want to replace it?", replaced_name);
00355 gtk_window_set_title(GTK_WINDOW(dialog), "Confirm Replace");
00356
00357 response = gtk_dialog_run(GTK_DIALOG(dialog));
00358 gtk_widget_destroy(dialog);
00359
00360 if(response == GTK_RESPONSE_YES)
00361 {
00362 DeleteRecords(replaced_name);
00363 con_to_sql(qry);
00364 }
00365 }
00366 }
00367 sqlite3_close (db);
00368 return 0;
00369 }
00370
00371
00372
00378 int LoadRecords(GtkTreeModel *model)
00379 {
00380 char qry[1024];
00381 GtkWidget *dialog;
00382 gint response;
00383 int rc;
00384
00385
00386 bzero(qry, 1024);
00387 sprintf(qry , "select * from birthday_tbl order by name");
00388
00389 rc = load_sql(model, qry, 0);
00390 if (rc)
00391 {
00392 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "No Previous Birthday File Found. Do you want to create new Birthday File?");
00393
00394 gtk_window_set_title(GTK_WINDOW(dialog), "File Not Found!");
00395
00396 response = gtk_dialog_run(GTK_DIALOG(dialog));
00397 gtk_widget_destroy(dialog);
00398
00399 if(response == GTK_RESPONSE_YES)
00400 {
00401
00402
00403 bzero(qry, 1024);
00404 sprintf(qry , "create table birthday_tbl (name, birth_date, email_id, primary key(name))");
00405
00406 rc = load_sql(model, qry, 0);
00407 if(rc)
00408 {
00409
00410 exit(1);
00411 }
00412 else
00413 {
00414
00415 }
00416
00417
00418 sqlite3 *db;
00419 char *zErrMsg = 0;
00420
00421 rc = sqlite3_open ("Birthday", &db);
00422 if (rc)
00423 {
00424
00425 sqlite3_close (db);
00426 exit (1);
00427 }
00428
00429 bzero(qry, 1024);
00430 sprintf(qry , "create table parameters_tbl (days_after_event, days_in_advance, startup)");
00431
00432 rc = sqlite3_exec (db, qry, callback_parameters, 0, &zErrMsg);
00433 if(rc)
00434 {
00435
00436 exit(1);
00437 }
00438 else
00439 {
00440
00441 }
00442
00443 sqlite3_close (db);
00444
00445 }
00446 else
00447 {
00448 system("rm Birthday");
00449 exit(0);
00450 return 0;
00451 }
00452
00453 }
00454 else
00455 {
00456
00457 }
00458
00459 return(0);
00460 }
00461
00469 static int sql_callback_load (void *model, int argc, char **argv, char **azColName)
00470 {
00471 if(argc)
00472 fill_model((GtkTreeModel *)model, argv[0] , argv[1] ? argv[1] : "NULL", argv[2] ? argv[2] : "NULL");
00473
00474 return 0;
00475 }
00476
00483 int load_sql (GtkTreeModel *model, char *qry, int flag)
00484 {
00485 sqlite3 *db;
00486 char *zErrMsg = 0;
00487
00488 int rc;
00489
00490 rc = sqlite3_open ("Birthday", &db);
00491 if (rc)
00492 {
00493
00494 sqlite3_close (db);
00495 exit (1);
00496 }
00497
00498 if(flag)
00499 {
00500 rc = sqlite3_exec (db, qry, sql_callback, (void *)model, &zErrMsg);
00501 }
00502 else
00503 {
00504 rc = sqlite3_exec (db, qry, sql_callback_load, (void *)model, &zErrMsg);
00505 }
00506 if (rc != SQLITE_OK)
00507 {
00508
00509 sqlite3_close (db);
00510 return(1);
00511 }
00512
00513 sqlite3_close (db);
00514
00515 return 0;
00516 }
00517
00518
00519
00520
00521
00522 enum
00523 {
00524 COL_NAME = 0,
00525 COL_BIRTH,
00526 COL_EMAIL,
00527 NUM_COLS
00528 } ;
00529
00533 static GtkTreeModel* create_model()
00534 {
00535 GtkListStore *store;
00536
00537 store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
00538
00539 return GTK_TREE_MODEL (store);
00540 }
00541
00549 void fill_model (GtkTreeModel *model, char* name, char* bdate, char* email)
00550 {
00551 GtkListStore *store;
00552 GtkTreeIter iter;
00553
00554 store = GTK_LIST_STORE(model);
00555
00556
00557 gtk_list_store_append (store, &iter);
00558 gtk_list_store_set (store, &iter, COL_NAME, name, COL_BIRTH, bdate, COL_EMAIL, email, -1);
00559
00560 }
00561
00565 static GtkWidget* create_view (void)
00566 {
00567 GtkCellRenderer *renderer;
00568 GtkTreeModel *model;
00569 GtkWidget *view;
00570
00571 view = gtk_tree_view_new ();
00572
00573
00574
00575 renderer = gtk_cell_renderer_text_new ();
00576 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, "Name", renderer, "text", COL_NAME, NULL);
00577
00578
00579
00580 renderer = gtk_cell_renderer_text_new ();
00581 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, "Birth Date", renderer, "text", COL_BIRTH, NULL);
00582
00583
00584
00585 renderer = gtk_cell_renderer_text_new ();
00586 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, "Email", renderer, "text", COL_EMAIL, NULL);
00587
00588 model = create_model();
00589 LoadRecords(model);
00590
00591 gtk_tree_view_set_model (GTK_TREE_VIEW (view), model);
00592
00593
00594
00595
00596
00597 g_object_unref (model);
00598
00599 return view;
00600 }
00601
00602
00603
00609 void callback_action_add(GtkWidget *widget,GtkTreeView *view )
00610 {
00611
00612 gtk_widget_set_sensitive(widget,FALSE);
00613
00614
00615 GtkWidget *table;
00616 GtkWidget *button_save,*button_cancel;
00617 GtkWidget *lbl_name,*lbl_heading,*lbl_bday,*lbl_email;
00618
00619 int i;
00620
00621
00622
00623 add_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00624 gtk_window_set_position((GtkWindow *)add_window, GTK_WIN_POS_CENTER);
00625 gtk_window_set_title(GTK_WINDOW(add_window), "**ADD New Record**");
00626 gtk_window_set_default_size(GTK_WINDOW(add_window),300,150);
00627 gtk_container_set_border_width(GTK_CONTAINER(add_window),20);
00628
00629
00630 table = gtk_table_new (5, 4, TRUE);
00631
00632
00633 gtk_container_add (GTK_CONTAINER (add_window), table);
00634
00635 lbl_heading=gtk_label_new("Add New Record");
00636 gtk_table_attach_defaults (GTK_TABLE(table), lbl_heading, 0, 4, 0, 1);
00637
00638 lbl_name=gtk_label_new("Name*");
00639 gtk_table_attach_defaults (GTK_TABLE(table), lbl_name, 0, 1, 1, 2);
00640
00641 entry_name = gtk_entry_new();
00642 gtk_table_attach_defaults (GTK_TABLE(table), entry_name, 1, 4, 1, 2);
00643
00644 lbl_bday=gtk_label_new("Birth Date*");
00645 gtk_table_attach_defaults (GTK_TABLE(table), lbl_bday, 0, 1, 2, 3);
00646
00647 char temp[10];
00648
00649
00650 combo_month = gtk_combo_box_new_text();
00651
00652 sprintf(temp,"MM");
00653 gtk_combo_box_append_text(GTK_COMBO_BOX (combo_month),temp);
00654
00655 for(i=1;i<=12;i++)
00656 {
00657 if(i <= 9)
00658 {
00659 sprintf(temp,"0%d",i);
00660 }
00661 else
00662 {
00663 sprintf(temp,"%d",i);
00664 }
00665 gtk_combo_box_append_text(GTK_COMBO_BOX (combo_month),temp);
00666
00667 }
00668
00669 gtk_combo_box_set_active(GTK_COMBO_BOX(combo_month ),0);
00670
00671
00672 gtk_table_attach_defaults (GTK_TABLE(table), combo_month, 1, 2, 2, 3);
00673
00674
00675 combo_date = gtk_combo_box_new_text();
00676 sprintf(temp,"DD");
00677 gtk_combo_box_append_text(GTK_COMBO_BOX (combo_date),temp);
00678 for(i=1;i<=31;i++)
00679 {
00680 if(i <= 9)
00681 {
00682 sprintf(temp,"0%d",i);
00683 }
00684 else
00685 {
00686 sprintf(temp,"%d",i);
00687 }
00688 gtk_combo_box_append_text(GTK_COMBO_BOX (combo_date),temp);
00689 }
00690
00691 gtk_combo_box_set_active(GTK_COMBO_BOX(combo_date),0);
00692
00693
00694 gtk_table_attach_defaults (GTK_TABLE(table), combo_date, 2, 3, 2, 3);
00695
00696
00697
00698
00699 combo_year = gtk_combo_box_new_text();
00700 sprintf(temp,"YYYY");
00701 gtk_combo_box_append_text(GTK_COMBO_BOX (combo_year),temp);
00702 for(i=1950;i<=2050;i++)
00703 {
00704 sprintf(temp,"%d",i);
00705
00706 gtk_combo_box_append_text(GTK_COMBO_BOX (combo_year),temp);
00707
00708 }
00709
00710 gtk_combo_box_set_active(GTK_COMBO_BOX(combo_year),0);
00711
00712
00713 gtk_table_attach_defaults (GTK_TABLE(table), combo_year, 3, 4, 2, 3);
00714
00715
00716 lbl_email=gtk_label_new("Email Address");
00717 gtk_table_attach_defaults (GTK_TABLE(table), lbl_email, 0, 1, 3, 4);
00718
00719 entry_email = gtk_entry_new();
00720 gtk_table_attach_defaults (GTK_TABLE(table), entry_email, 1, 4, 3, 4);
00721
00722 button_save = gtk_button_new_with_label ("Save");
00723 g_signal_connect(G_OBJECT(button_save),"clicked",G_CALLBACK(callback_add_record) , view);
00724 gtk_table_attach_defaults (GTK_TABLE(table), button_save, 0, 2, 4, 5);
00725
00726
00727 button_cancel = gtk_button_new_with_label ("Cancel");
00728 g_signal_connect_swapped(G_OBJECT(button_cancel), "clicked", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(add_window));
00729 gtk_table_attach_defaults (GTK_TABLE(table), button_cancel, 2, 4, 4, 5);
00730
00731
00732 g_signal_connect(G_OBJECT(add_window),"destroy",G_CALLBACK(window_destroy),NULL);
00733
00734
00735 gtk_widget_show_all(add_window);
00736 gtk_main();
00737
00738 }
00739
00745 void callback_add_record(GtkWidget *widget,GtkTreeView *view)
00746 {
00747
00748 gtk_widget_set_sensitive(btn_new,TRUE);
00749
00750 const gchar *name,*month = NULL,*date = NULL,*year= NULL,*email;
00751 char dob[1024];
00752 GtkWidget *dialog;
00753 name = gtk_entry_get_text(GTK_ENTRY(entry_name));
00754 email = gtk_entry_get_text(GTK_ENTRY(entry_email));
00755
00756 month = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo_month));
00757 date = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo_date));
00758 year = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo_year));
00759
00760 if(strcmp(name,"") == 0)
00761 {
00762 dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Name not entered. Please enter name");
00763 gtk_window_set_title(GTK_WINDOW(dialog), "Error");
00764 gtk_dialog_run (GTK_DIALOG (dialog));
00765 gtk_widget_destroy (dialog);
00766
00767 return ;
00768 }
00769
00770
00771 if(strcmp(month , "MM" ) == 0 || strcmp(date , "DD" ) == 0 || strcmp(year , "YYYY" ) == 0)
00772 {
00773 dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Date not entered. Please enter complete date.");
00774 gtk_window_set_title(GTK_WINDOW(dialog), "Error");
00775 gtk_dialog_run (GTK_DIALOG (dialog));
00776 gtk_widget_destroy (dialog);
00777
00778 return ;
00779 }
00780 else
00781 {
00782 sprintf(dob,"%s-%s-%s",(char *)month,(char *)date,(char *)year);
00783 }
00784
00785 clicked_name = (char*)name;
00786 replaced_name = clicked_name;
00787 clicked_dob = dob;
00788 clicked_email = (char*)email;
00789 AddRecords((char*)name, dob, (char*)email);
00790
00791 gtk_widget_destroy (add_window);
00792
00793 gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(view)));
00794 LoadRecords(gtk_tree_view_get_model(view));
00795 }
00796
00802 void callback_action_edit(GtkWidget * widget, GtkTreeView * view)
00803 {
00804
00805
00806 int res;
00807
00808 res = row_selected(view);
00809 if(res)
00810 {
00811 return;
00812 }
00813
00814
00815 gtk_widget_set_sensitive(widget,FALSE);
00816
00817 GtkWidget *table;
00818 GtkWidget *button_save,*button_cancel;
00819 GtkWidget *lbl_name,*lbl_heading,*lbl_bday,*lbl_email;
00820
00821 int i;
00822
00823
00824
00825 edit_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00826 gtk_window_set_position((GtkWindow *)edit_window, GTK_WIN_POS_CENTER);
00827 gtk_window_set_title(GTK_WINDOW(edit_window), "**EDIT Record**");
00828 gtk_window_set_default_size(GTK_WINDOW(edit_window),300,150);
00829 gtk_container_set_border_width(GTK_CONTAINER(edit_window),20);
00830
00831
00832 table = gtk_table_new (5, 4, TRUE);
00833
00834
00835 gtk_container_add (GTK_CONTAINER (edit_window), table);
00836
00837 lbl_heading=gtk_label_new("Edit This Record");
00838 gtk_table_attach_defaults (GTK_TABLE(table), lbl_heading, 0, 4, 0, 1);
00839
00840 lbl_name=gtk_label_new("Name*");
00841 gtk_table_attach_defaults (GTK_TABLE(table), lbl_name, 0, 1, 1, 2);
00842
00843 edit_entry_name = gtk_entry_new();
00844 gtk_entry_set_text(GTK_ENTRY(edit_entry_name), clicked_name);
00845 gtk_table_attach_defaults (GTK_TABLE(table), edit_entry_name, 1, 4, 1, 2);
00846
00847 lbl_bday=gtk_label_new("Birth Date*");
00848 gtk_table_attach_defaults (GTK_TABLE(table), lbl_bday, 0, 1, 2, 3);
00849
00850 char *pch,mm[5],dd[5],yy[10];
00851 int count = 0;
00852
00853 strcpy(mm ,"0");
00854 strcpy(dd ,"0");
00855 strcpy(yy ,"0");
00856
00857 if(clicked_dob != NULL)
00858 {
00859 pch = strtok (clicked_dob,"-");
00860 while (pch != NULL)
00861 {
00862 if(count == 0)
00863 {
00864 strcpy(mm,pch);
00865 }
00866 if(count == 1)
00867 {
00868 strcpy(dd,pch);
00869 }
00870 if(count == 2)
00871 {
00872 strcpy(yy,pch);
00873 }
00874 pch = strtok (NULL, "-");
00875 count++;
00876 }
00877 }
00878
00879 char temp[10];
00880
00881
00882 edit_combo_month = gtk_combo_box_new_text();
00883 sprintf(temp,"MM");
00884 gtk_combo_box_append_text(GTK_COMBO_BOX (edit_combo_month),temp);
00885
00886 for(i=1;i<=12;i++)
00887 {
00888 if(i <= 9)
00889 {
00890 sprintf(temp,"0%d",i);
00891 }
00892 else
00893 {
00894 sprintf(temp,"%d",i);
00895 }
00896 gtk_combo_box_append_text(GTK_COMBO_BOX (edit_combo_month),temp);
00897
00898 }
00899
00900 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_combo_month ),atoi(mm));
00901 gtk_table_attach_defaults (GTK_TABLE(table), edit_combo_month, 1, 2, 2, 3);
00902
00903
00904 edit_combo_date = gtk_combo_box_new_text();
00905 sprintf(temp,"MM");
00906 gtk_combo_box_append_text(GTK_COMBO_BOX (edit_combo_date),temp);
00907
00908 for(i=1;i<=31;i++)
00909 {
00910 if(i <= 9)
00911 {
00912 sprintf(temp,"0%d",i);
00913 }
00914 else
00915 {
00916 sprintf(temp,"%d",i);
00917 }
00918 gtk_combo_box_append_text(GTK_COMBO_BOX (edit_combo_date),temp);
00919 }
00920
00921 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_combo_date ),atoi(dd));
00922 gtk_table_attach_defaults (GTK_TABLE(table), edit_combo_date, 2, 3, 2, 3);
00923
00924
00925 edit_combo_year = gtk_combo_box_new_text();
00926 sprintf(temp,"MM");
00927 gtk_combo_box_append_text(GTK_COMBO_BOX (edit_combo_year),temp);
00928
00929 for(i=1950;i<=2050;i++)
00930 {
00931 sprintf(temp,"%d",i);
00932
00933 gtk_combo_box_append_text(GTK_COMBO_BOX (edit_combo_year),temp);
00934
00935 }
00936
00937 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_combo_year ),(atoi(yy)-1949));
00938 gtk_table_attach_defaults (GTK_TABLE(table), edit_combo_year, 3, 4, 2, 3);
00939
00940
00941 lbl_email=gtk_label_new("Email Address");
00942 gtk_table_attach_defaults (GTK_TABLE(table), lbl_email, 0, 1, 3, 4);
00943
00944 edit_entry_email = gtk_entry_new();
00945 gtk_entry_set_text(GTK_ENTRY(edit_entry_email), clicked_email);
00946 gtk_table_attach_defaults (GTK_TABLE(table), edit_entry_email, 1, 4, 3, 4);
00947
00948 button_save = gtk_button_new_with_label ("Save");
00949 g_signal_connect(G_OBJECT(button_save),"clicked",G_CALLBACK(callback_edit_record) , view);
00950 gtk_table_attach_defaults (GTK_TABLE(table), button_save, 0, 2, 4, 5);
00951
00952
00953 button_cancel = gtk_button_new_with_label ("Cancel");
00954 g_signal_connect_swapped(G_OBJECT(button_cancel), "clicked", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(edit_window));
00955 gtk_table_attach_defaults (GTK_TABLE(table), button_cancel, 2, 4, 4, 5);
00956
00957
00958 g_signal_connect(G_OBJECT(edit_window),"destroy",G_CALLBACK(window_destroy),NULL);
00959
00960
00961 gtk_widget_show_all(edit_window);
00962 gtk_main();
00963 }
00964
00970 void callback_edit_record(GtkWidget *widget,GtkTreeView *view)
00971 {
00972
00973 gtk_widget_set_sensitive(btn_edit,TRUE);
00974
00975
00976 const gchar *name,*month = NULL,*date = NULL,*year= NULL,*email;
00977 char dob[1024];
00978 GtkWidget *dialog;
00979
00980 name = gtk_entry_get_text(GTK_ENTRY(edit_entry_name));
00981 email = gtk_entry_get_text(GTK_ENTRY(edit_entry_email));
00982
00983 month = gtk_combo_box_get_active_text(GTK_COMBO_BOX(edit_combo_month));
00984 date = gtk_combo_box_get_active_text(GTK_COMBO_BOX(edit_combo_date));
00985 year = gtk_combo_box_get_active_text(GTK_COMBO_BOX(edit_combo_year));
00986
00987 if(strcmp(name,"") == 0)
00988 {
00989 dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Name not entered. Please enter name");
00990 gtk_window_set_title(GTK_WINDOW(dialog), "Error");
00991 gtk_dialog_run (GTK_DIALOG (dialog));
00992 gtk_widget_destroy (dialog);
00993
00994 return ;
00995 }
00996
00997 if(strcmp(month , "MM" ) == 0 || strcmp(date , "DD" ) == 0 || strcmp(year , "YYYY" ) == 0)
00998 {
00999 dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Date not entered. Please enter complete date.");
01000 gtk_window_set_title(GTK_WINDOW(dialog), "Error");
01001 gtk_dialog_run (GTK_DIALOG (dialog));
01002 gtk_widget_destroy (dialog);
01003
01004 return ;
01005 }
01006 else
01007 {
01008 sprintf(dob,"%s-%s-%s",(char *)month,(char *)date,(char *)year);
01009 }
01010
01011 replaced_name = (char*)name;
01012 EditRecords(clicked_name, (char*)name, dob, (char*)email);
01013
01014 gtk_widget_destroy (edit_window);
01015
01016 gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(view)));
01017 LoadRecords(gtk_tree_view_get_model(view));
01018 }
01019
01025 void callback_action_delete(GtkWidget * widget, GtkTreeView * view)
01026 {
01027
01028
01029 int res;
01030
01031 res = row_selected(view);
01032 if(res)
01033 {
01034 return;
01035 }
01036
01037 GtkWidget *dialog;
01038 gint response;
01039
01040 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Delete %s's Record! Are You Sure?", clicked_name);
01041 gtk_window_set_title(GTK_WINDOW(dialog), "Confirm Delete");
01042
01043 response = gtk_dialog_run(GTK_DIALOG(dialog));
01044 gtk_widget_destroy(dialog);
01045
01046 if(response == GTK_RESPONSE_YES)
01047 {
01048 DeleteRecords(clicked_name);
01049 gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(view)));
01050 LoadRecords(gtk_tree_view_get_model(view));
01051 }
01052
01053
01054
01055 }
01056
01062 void window_destroy(GtkWidget *widget, gpointer data)
01063 {
01064
01065 gtk_widget_set_sensitive(btn_new,TRUE);
01066
01067
01068 gtk_widget_set_sensitive(btn_edit,TRUE);
01069
01070 gtk_main_quit();
01071 }
01072
01077 int row_selected(GtkTreeView *view)
01078 {
01079 GtkTreeIter iter;
01080 GtkTreeModel *model;
01081 GtkTreeSelection* select;
01082 GList* list;
01083 guint row_clicked_count;
01084 GtkWidget *dialog;
01085 GtkTreePath* path;
01086
01087 select = gtk_tree_view_get_selection(view);
01088
01089 list = gtk_tree_selection_get_selected_rows(select, NULL);
01090
01091 row_clicked_count = g_list_length(list);
01092
01093 if(row_clicked_count < 1)
01094 {
01095 dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "No Record Selected! Please Select a Record.");
01096 gtk_window_set_title(GTK_WINDOW(dialog), "Error");
01097 gtk_dialog_run (GTK_DIALOG (dialog));
01098 gtk_widget_destroy (dialog);
01099
01100 return(1) ;
01101 }
01102 else if(row_clicked_count > 1)
01103 {
01104 dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "More Than One Record Selected! Select One Record At a Time.");
01105 gtk_window_set_title(GTK_WINDOW(dialog), "Error");
01106 gtk_dialog_run (GTK_DIALOG (dialog));
01107 gtk_widget_destroy (dialog);
01108
01109 return(1) ;
01110 }
01111
01112 path = (GtkTreePath*)g_list_nth_data(list, 0);
01113
01114 model = gtk_tree_view_get_model(view);
01115
01116 if(gtk_tree_model_get_iter(model, &iter, path))
01117 {
01118 gtk_tree_model_get(model, &iter, COL_NAME, &clicked_name, -1);
01119
01120 gtk_tree_model_get(model, &iter, COL_BIRTH, &clicked_dob, -1);
01121
01122 gtk_tree_model_get(model, &iter, COL_EMAIL, &clicked_email, -1);
01123
01124 replaced_name = clicked_name;
01125 }
01126 return(0);
01127 }
01128
01136 void callback_rowselected(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data)
01137 {
01138 callback_action_edit(btn_edit, view);
01139 }
01140
01141
01142
01143
01144 enum
01145 {
01146 NEW_COL_STRING = 0,
01147 NEW_COL_EMAIL,
01148 NEW_NUM_COLS
01149 };
01150
01154 static GtkTreeModel* create_second_model()
01155 {
01156 GtkListStore *second_store;
01157
01158 second_store = gtk_list_store_new (NEW_NUM_COLS, G_TYPE_STRING, G_TYPE_STRING);
01159
01160 return GTK_TREE_MODEL (second_store);
01161 }
01162
01169 void fill_second_model (GtkTreeModel *second_model, char* str, char* email)
01170 {
01171 GtkListStore *second_store;
01172 GtkTreeIter second_iter;
01173
01174 second_store = GTK_LIST_STORE(second_model);
01175
01176
01177 gtk_list_store_append (second_store, &second_iter);
01178 gtk_list_store_set (second_store, &second_iter, NEW_COL_STRING, str, NEW_COL_EMAIL, email, -1);
01179 }
01180
01184 static GtkWidget* create_second_view (void)
01185 {
01186 GtkCellRenderer *second_renderer;
01187 GtkTreeModel *second_model;
01188 GtkWidget *second_view;
01189
01190 second_view = gtk_tree_view_new ();
01191
01192
01193
01194 second_renderer = gtk_cell_renderer_text_new ();
01195 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (second_view), -1, "BirthDay Updates", second_renderer, "text", NEW_COL_STRING, NULL);
01196
01197
01198
01199
01200
01201
01202
01203 second_model = create_second_model();
01204 ReadRecords(second_model);
01205
01206 gtk_tree_view_set_model (GTK_TREE_VIEW (second_view), second_model);
01207
01208
01209
01210
01211
01212 g_object_unref (second_model);
01213
01214 return second_view;
01215 }
01216
01220 int listwindow()
01221 {
01222 GtkWidget *window;
01223 GtkWidget *scroll_window;
01224 GtkWidget *vbox;
01225 GtkWidget *btn_email, *btn_mainwindow, *btn_ok;
01226 GtkWidget *second_view;
01227 GtkWidget *table;
01228
01229 flag_listwindow = 0;
01230
01231
01232
01233
01234 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
01235 gtk_window_set_position((GtkWindow *)window, GTK_WIN_POS_CENTER);
01236 gtk_window_set_title(GTK_WINDOW(window), "BirthDay Updates");
01237 gtk_window_set_default_size(GTK_WINDOW(window),400,250);
01238 gtk_container_set_border_width(GTK_CONTAINER(window),20);
01239
01240
01241 vbox = gtk_vbox_new (FALSE, 10);
01242
01243
01244 scroll_window = gtk_scrolled_window_new(NULL,NULL);
01245 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
01246
01247
01248
01249 second_view = create_second_view ();
01250 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(second_view), FALSE);
01251
01252
01253
01254 gtk_container_add (GTK_CONTAINER (scroll_window), second_view);
01255
01256
01257 table = gtk_table_new (1, 6, TRUE);
01258
01259
01260 btn_mainwindow = gtk_button_new_with_label("Home");
01261 g_signal_connect(G_OBJECT(btn_mainwindow),"clicked",G_CALLBACK(callback_quit) , NULL);
01262 gtk_table_attach_defaults (GTK_TABLE(table), btn_mainwindow, 2, 4, 0, 1);
01263
01264 btn_email = gtk_button_new_with_label("Email");
01265 g_signal_connect(G_OBJECT(btn_email),"clicked",G_CALLBACK(callback_email) ,second_view);
01266 gtk_table_attach_defaults (GTK_TABLE(table), btn_email, 0, 1, 0, 1);
01267
01268 btn_ok = gtk_button_new_with_label("Close");
01269
01270 g_signal_connect(G_OBJECT(btn_ok),"clicked",G_CALLBACK(exit_program), NULL);
01271 gtk_table_attach_defaults (GTK_TABLE(table), btn_ok, 5, 6, 0, 1);
01272
01273
01274 gtk_box_pack_start(GTK_BOX (vbox), scroll_window, TRUE, TRUE, 0);
01275 gtk_box_pack_start(GTK_BOX (vbox), table, FALSE, FALSE, 0);
01276
01277
01278 gtk_container_add (GTK_CONTAINER (window), vbox);
01279
01280
01281 g_signal_connect(G_OBJECT(window), "delete-event",G_CALLBACK(exit_program), NULL);
01282
01283
01284
01285 if(flag_listwindow == 0)
01286 {
01287 fill_second_model (gtk_tree_view_get_model(GTK_TREE_VIEW(second_view)), "No Birthday in Recent & Upcoming Days!", "");
01288 }
01289
01290 gtk_widget_show_all(window);
01291 gtk_main();
01292
01293 gtk_widget_destroy(window);
01294
01295 return EXIT_SUCCESS;
01296 }
01297
01303 void callback_quit(GtkWidget *widget, gpointer data)
01304 {
01305 gtk_main_quit();
01306 }
01307
01313 void exit_program(GtkWidget *widget, gpointer data)
01314 {
01315 gtk_main_quit();
01316 exit(0);
01317 }
01318
01319
01325 int main(int argc, char *argv[])
01326 {
01327 GtkWidget *window;
01328 GtkWidget *scroll_window;
01329 GtkWidget *vbox;
01330 GtkWidget *hbox;
01331 GtkWidget *btn_export, *btn_import, *btn_close;
01332 GtkWidget *lbl_previous_days,*lbl_after_days,*lbl_csv;
01333 GtkWidget *chk_startup;
01334 GtkWidget *view;
01335 GtkWidget *table;
01336
01337 clicked_name = NULL;
01338 clicked_dob = NULL;
01339 clicked_email = NULL;
01340 replaced_name = clicked_name;
01341
01342 ReadParameters();
01343
01344
01345 gtk_init(&argc, &argv);
01346
01347 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
01348 gtk_window_set_position((GtkWindow *)window, GTK_WIN_POS_CENTER);
01349 gtk_window_set_title(GTK_WINDOW(window), "BirthDay Reminder");
01350 gtk_window_set_default_size(GTK_WINDOW(window),500,400);
01351 gtk_container_set_border_width(GTK_CONTAINER(window),20);
01352
01353
01354
01355 vbox = gtk_vbox_new (FALSE, 10);
01356
01357
01358 scroll_window = gtk_scrolled_window_new(NULL,NULL);
01359 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
01360
01361
01362
01363 view = create_view ();
01364 gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column((GtkTreeView *)view, COL_NAME), COL_NAME);
01365 gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column((GtkTreeView *)view, COL_BIRTH), COL_BIRTH);
01366 gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column((GtkTreeView *)view, COL_EMAIL), COL_EMAIL);
01367 gtk_tree_view_set_grid_lines((GtkTreeView *)view, GTK_TREE_VIEW_GRID_LINES_HORIZONTAL);
01368
01369
01370 g_signal_connect(G_OBJECT(view),"row-activated",GTK_SIGNAL_FUNC(callback_rowselected),NULL);
01371
01372
01373
01374
01375 gtk_container_add (GTK_CONTAINER (scroll_window), view);
01376
01377 hbox = gtk_hbox_new (FALSE, 10);
01378
01379
01380
01381 btn_new = gtk_button_new_with_label("Add");
01382
01383 gtk_box_pack_start(GTK_BOX (hbox), btn_new, TRUE, TRUE, 0);
01384 g_signal_connect(G_OBJECT(btn_new),"clicked",G_CALLBACK(callback_action_add) , view);
01385
01386 btn_edit = gtk_button_new_with_label("Edit");
01387 gtk_box_pack_start(GTK_BOX (hbox), btn_edit, TRUE, TRUE, 0);
01388 g_signal_connect(G_OBJECT(btn_edit),"clicked",G_CALLBACK(callback_action_edit) ,view);
01389
01390 btn_delete = gtk_button_new_with_label("Delete");
01391 gtk_box_pack_start(GTK_BOX (hbox), btn_delete, TRUE, TRUE, 0);
01392 g_signal_connect(G_OBJECT(btn_delete),"clicked",G_CALLBACK(callback_action_delete) , view);
01393
01394
01395 table = gtk_table_new (4, 6, TRUE);
01396 gtk_table_set_col_spacing (GTK_TABLE(table),2,10);
01397
01398
01399 lbl_previous_days=gtk_label_new("Report Previous Days");
01400 gtk_misc_set_alignment(GTK_MISC(lbl_previous_days), 0 ,0.5);
01401 gtk_table_attach_defaults (GTK_TABLE(table), lbl_previous_days, 0, 2, 0, 1);
01402
01403 spin_pdays = gtk_spin_button_new_with_range(1, 30, 1);
01404 gtk_table_attach_defaults (GTK_TABLE(table), spin_pdays, 2, 3, 0, 1);
01405
01406 lbl_after_days=gtk_label_new("Report Days in Advance");
01407 gtk_misc_set_alignment(GTK_MISC(lbl_after_days), 0 ,0.5);
01408 gtk_table_attach_defaults (GTK_TABLE(table), lbl_after_days, 0, 2, 1, 2);
01409
01410 spin_adays = gtk_spin_button_new_with_range(1, 90, 1);
01411 gtk_table_attach_defaults (GTK_TABLE(table), spin_adays, 2, 3, 1, 2);
01412
01413 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_pdays), (day_after_event));
01414 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_adays), (day_in_advance));
01415
01416
01417 btn_import = gtk_button_new_with_label("Import BirthDay List");
01418 g_signal_connect(G_OBJECT(btn_import),"clicked",G_CALLBACK(callback_upload) ,view);
01419 gtk_table_attach_defaults (GTK_TABLE(table), btn_import, 4, 6, 0, 1);
01420
01421 btn_export = gtk_button_new_with_label("Export BirthDay List");
01422 g_signal_connect(G_OBJECT(btn_export),"clicked",G_CALLBACK(callback_generate) , NULL);
01423 gtk_table_attach_defaults (GTK_TABLE(table), btn_export, 4, 6, 1, 2);
01424
01425 lbl_csv = gtk_label_new("(Supported Format : CSV)");
01426 gtk_misc_set_alignment(GTK_MISC(lbl_csv), 0 ,0.5);
01427 gtk_table_attach_defaults (GTK_TABLE(table), lbl_csv, 4, 6, 2, 3);
01428
01429
01430 chk_startup = gtk_check_button_new_with_label("Run on startup");
01431 g_signal_connect(G_OBJECT(chk_startup),"clicked",G_CALLBACK(check_button_callback) , NULL);
01432 gtk_table_attach_defaults (GTK_TABLE(table),chk_startup, 0, 2, 2, 3);
01433
01434
01435 btn_close = gtk_button_new_with_label("Exit");
01436 g_signal_connect(G_OBJECT(btn_close),"clicked",G_CALLBACK(main_window_destroy) , NULL);
01437 gtk_table_attach_defaults (GTK_TABLE(table), btn_close, 4, 6, 3, 4);
01438
01439
01440
01441 gtk_box_pack_start(GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
01442 gtk_box_pack_start(GTK_BOX (vbox), scroll_window, TRUE, TRUE, 0);
01443 gtk_box_pack_start(GTK_BOX (vbox), table, FALSE, FALSE, 0);
01444
01445
01446 gtk_container_add (GTK_CONTAINER (window), vbox);
01447
01448
01449 g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(main_window_destroy),NULL);
01450
01451
01452
01453 listwindow();
01454
01455 gtk_widget_show_all(window);
01456 gtk_main();
01457
01458 return EXIT_SUCCESS;
01459 }
01460
01461
01467 void main_window_destroy(GtkWidget *widget, gpointer data)
01468 {
01469 day_in_advance = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_adays));
01470 day_after_event = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_pdays) );
01471 parameters(day_after_event,day_in_advance,startup);
01472 gtk_main_quit();
01473 }
01474
01480 void check_button_callback (GtkWidget *widget, gpointer data)
01481 {
01482 if (GTK_TOGGLE_BUTTON (widget)->active)
01483 {
01484 startup = 1;
01485 }
01486 else {
01487 startup = 0;
01488 }
01489 }
01490
01497 void parameters( int days_after_event, int days_in_advance, int s)
01498 {
01499 sqlite3 *db;
01500 char *zErrMsg = 0;
01501 int rc;
01502 char sql_query[1024];
01503
01504 rc = sqlite3_open ("Birthday", &db);
01505 if (rc)
01506 {
01507 fprintf (stderr, "Can't open database: %s\n", sqlite3_errmsg (db));
01508 sqlite3_close (db);
01509 exit (1);
01510 }
01511
01512 strcpy(sql_query, "delete from parameters_tbl");
01513 rc = sqlite3_exec (db, sql_query, callback_parameters, 0, &zErrMsg);
01514 if (rc != SQLITE_OK)
01515 {
01516
01517 }
01518
01519 sprintf(sql_query, "insert into parameters_tbl values (%d,%d,%d)",days_after_event, days_in_advance, s);
01520 rc = sqlite3_exec (db, sql_query, callback_parameters, 0, &zErrMsg);
01521 if (rc != SQLITE_OK)
01522 {
01523
01524 }
01525
01526 return;
01527 }
01528
01536 static int callback_parameters (void *NotUsed, int argc, char **argv, char **azColName)
01537 {
01538 NotUsed = 0;
01539 if(argc)
01540 {
01541 day_after_event = atof(argv[0]);
01542 day_in_advance = atof(argv[1]);
01543
01544 startup = atoi(argv[2]);
01545 }
01546
01547 return 0;
01548 }
01549
01553 int ReadParameters()
01554 {
01555
01556 sqlite3 *db;
01557 char *zErrMsg = 0;
01558 int rc;
01559 char sql_query[1024];
01560
01561 rc = sqlite3_open ("Birthday", &db);
01562 if (rc)
01563 {
01564 fprintf (stderr, "Can't open database: %s\n", sqlite3_errmsg (db));
01565 sqlite3_close (db);
01566
01567 }
01568
01569 strcpy(sql_query, "select * from parameters_tbl");
01570 rc = sqlite3_exec (db, sql_query, callback_parameters, 0, &zErrMsg);
01571 if (rc != SQLITE_OK)
01572 {
01573
01574 }
01575
01576 return 0;
01577 }
01578
01579
01580
01581
01582
01583
01591 static int callback_csv (void *filePointer, int argc, char **argv, char **azColName)
01592 {
01593 if(argc)
01594 fprintf((FILE*)filePointer,"%s, %s, %s\n",argv[0],argv[1],argv[2]);
01595
01596 return 0;
01597 }
01598
01599
01605 int callback_generate(GtkWidget* btn, gpointer data)
01606 {
01607 sqlite3 *db;
01608 char *zErrMsg = 0;
01609 int rc;
01610 char qry[1024];
01611 FILE *fp;
01612 char *filename;
01613 GtkWidget *filedialog;
01614
01615
01616
01617 filedialog = gtk_file_chooser_dialog_new ("Save File", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
01618 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (filedialog), TRUE);
01619
01620
01621 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filedialog), "BirthDayList.csv");
01622
01623
01624 if (gtk_dialog_run (GTK_DIALOG (filedialog)) == GTK_RESPONSE_ACCEPT)
01625 {
01626
01627 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filedialog));
01628
01629 fp = fopen(filename,"w+");
01630
01631 g_free (filename);
01632 }
01633 else
01634 {
01635 gtk_widget_destroy (filedialog);
01636 return(0);
01637 }
01638 gtk_widget_destroy (filedialog);
01639
01640 strcpy(qry , "select * from birthday_tbl order by name");
01641
01642 rc = sqlite3_open ("Birthday", &db);
01643 if (rc)
01644 {
01645 fprintf (stderr, "Can't open database: %s\n", sqlite3_errmsg (db));
01646 sqlite3_close (db);
01647 exit (1);
01648 }
01649 rc = sqlite3_exec (db, qry, callback_csv, (void*)fp, &zErrMsg);
01650 if (rc != SQLITE_OK)
01651 {
01652
01653
01654 }
01655
01656 fclose(fp);
01657 sqlite3_close (db);
01658 return 0;
01659 }
01660
01661
01662
01668 int callback_upload (GtkWidget *widget1, GtkTreeView* view)
01669 {
01670 FILE *fp; char line[1024];
01671 char *filename;
01672 GtkWidget *filedialog;
01673 gint response;
01674 char *pch; int count = 0;
01675 char name[100],dob[15],email[100],*ptr;
01676
01677
01678 filedialog = gtk_file_chooser_dialog_new ("Choose File", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, "Upload", GTK_RESPONSE_YES, "Cancel", GTK_RESPONSE_NO, NULL);
01679
01680 response = gtk_dialog_run (GTK_DIALOG (filedialog));
01681
01682 if(response == GTK_RESPONSE_YES)
01683 {
01684 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filedialog));
01685
01686 fp = fopen (filename, "r");
01687 g_free (filename);
01688 }
01689 else
01690 {
01691 gtk_widget_destroy (filedialog);
01692 return(0);
01693 }
01694 gtk_widget_destroy (filedialog);
01695
01696 while((fscanf(fp,"%[^\n]",line)>0))
01697 {
01698 count = 0;
01699 fseek(fp,1,1);
01700 pch = strtok (line,",");
01701 while (pch != NULL)
01702 {
01703 if(count == 0)
01704 {
01705 strcpy(name,pch);
01706 }
01707 if(count == 1)
01708 {
01709 strcpy(dob,pch);
01710 }
01711 if(count == 2)
01712 {
01713 strcpy(email,pch);
01714 }
01715 pch = strtok (NULL, ",");
01716 count++;
01717 }
01718
01719 ptr = dob;
01720 ptr++;
01721 strcpy(dob,ptr);
01722
01723 ptr = email;
01724 ptr++;
01725 strcpy(email,ptr);
01726
01727 clicked_name = name;
01728 replaced_name = clicked_name;
01729 clicked_dob = dob;
01730 clicked_email = email;
01731 AddRecords(name, dob, email);
01732 gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(view)));
01733 LoadRecords(gtk_tree_view_get_model(view));
01734 }
01735 return(0);
01736 }
01737
01743 void callback_email (GtkWidget *widget, GtkTreeView *second_view)
01744 {
01745 char str[100];
01746
01747 mail_row_selected(second_view);
01748
01749 sprintf(str, "evolution mailto:%s", mail_clicked_email);
01750
01751
01752
01753 system(str);
01754 }
01755
01760 int mail_row_selected(GtkTreeView *view)
01761 {
01762 GtkTreeIter iter;
01763 GtkTreeModel *model;
01764 GtkTreeSelection* select;
01765 GList* list;
01766 guint row_clicked_count;
01767 GtkWidget *dialog;
01768 GtkTreePath* path;
01769
01770 select = gtk_tree_view_get_selection(view);
01771
01772 list = gtk_tree_selection_get_selected_rows(select, NULL);
01773
01774 row_clicked_count = g_list_length(list);
01775
01776 if(row_clicked_count < 1)
01777 {
01778 dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "No Record Selected! Please Select a Record.");
01779 gtk_window_set_title(GTK_WINDOW(dialog), "Error");
01780 gtk_dialog_run (GTK_DIALOG (dialog));
01781 gtk_widget_destroy (dialog);
01782
01783 return(1) ;
01784 }
01785 else if(row_clicked_count > 1)
01786 {
01787 dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "More Than One Record Selected! Select One Record At a Time.");
01788 gtk_window_set_title(GTK_WINDOW(dialog), "Error");
01789 gtk_dialog_run (GTK_DIALOG (dialog));
01790 gtk_widget_destroy (dialog);
01791
01792 return(1) ;
01793 }
01794
01795 path = (GtkTreePath*)g_list_nth_data(list, 0);
01796
01797 model = gtk_tree_view_get_model(view);
01798
01799 if(gtk_tree_model_get_iter(model, &iter, path))
01800 {
01801 gtk_tree_model_get(model, &iter, NEW_COL_EMAIL, &mail_clicked_email, -1);
01802 }
01803 return(0);
01804 }
01805
01806