/* WebDownloader for X-Window * Copyright (C) 1999-2002 Koshelev Maxim * This Program is free but not GPL!!! You can't modify it * without agreement with author. You can't distribute modified * program but you can distribute unmodified program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #include "fsched.h" #include "../schedule.h" #include "../var.h" #include "../ntlocale.h" #include "misc.h" #include "mywidget.h" #include "edit.h" #include "list.h" GtkWidget *d4x_scheduler_window=(GtkWidget *)NULL; GtkTreeView *d4x_scheduler_view=(GtkTreeView *)NULL; GtkListStore *d4x_scheduler_store=(GtkListStore *)NULL; /* static void d4x_scheduler_select(GtkWidget *clist, gint row, gint column, GdkEventButton *event) { if (event && event->type==GDK_2BUTTON_PRESS && event->button==1) }; */ static char *action_names[]={ N_("limit speed"), N_("popup main window"), N_("exit"), N_("remove completed"), N_("remove failed"), N_("restart download"), N_("stop download"), N_("remove download"), N_("remove download if completed"), N_("add download"), N_("save list"), N_("execute command") }; void d4x_scheduler_insert(d4xSchedAction *act,d4xSchedAction *prev){ if (d4x_scheduler_window==NULL) return; char *text[3]; char buf[MAX_LEN]; char buf2[MAX_LEN]; struct tm tm_time; *buf2=0; localtime_r(&(act->start_time),&tm_time); strftime(buf,MAX_LEN,"%T %d %b %Y",&tm_time); text[0]=buf; text[1]=_(action_names[act->type()]); text[2]=buf2; switch(act->type()){ case SACT_EXECUTE:{ d4xSAExecute *a=(d4xSAExecute *)act; g_snprintf(buf2,MAX_LEN,"%s",a->command.get()); break; }; case SACT_SAVE_LIST:{ d4xSASaveList *a=(d4xSASaveList *)act; g_snprintf(buf2,MAX_LEN,"%s",a->path.get()); break; }; case SACT_SET_SPEED:{ d4xSASpeed *a=(d4xSASpeed *)act; sprintf(buf2,"%s",_(SPEED_LIMITATIONS_NAMES[a->speed])); break; }; case SACT_ADD_DOWNLOAD:{ d4xSAAddDownload *a=(d4xSAAddDownload *)act; if (a->dwn){ g_snprintf(buf2,MAX_LEN,"%s",std::string(a->dwn->info).c_str()); }; break; }; case SACT_DEL_IF_COMPLETED: case SACT_DELETE_DOWNLOAD: case SACT_RUN_DOWNLOAD: case SACT_PAUSE_DOWNLOAD:{ d4xSAUrl *a=(d4xSAUrl *)act; if (a->url.is_valid()){ g_snprintf(buf2,MAX_LEN,"%s",std::string(a->url).c_str()); }; break; }; }; GtkTreeIter iter; if (prev) gtk_list_store_insert_after(d4x_scheduler_store,&iter,prev->iter); else gtk_list_store_insert_after(d4x_scheduler_store,&iter,NULL); gtk_list_store_set(d4x_scheduler_store, &iter, 0,text[0], 1,text[1], 2,text[2], 3,act, -1); if (act->iter) gtk_tree_iter_free(act->iter); act->iter=gtk_tree_iter_copy(&iter); }; void d4x_scheduler_remove(d4xSchedAction *act){ if (d4x_scheduler_window==NULL) return; gtk_list_store_remove(d4x_scheduler_store,act->iter); }; static gint compare_nodes2(gconstpointer a,gconstpointer b){ gint aa=GPOINTER_TO_INT(a); gint bb=GPOINTER_TO_INT(b); if (aa>bb) return -1; if (aa==bb) return 0; return 1; }; void d4x_scheduler_remove_selected(){ if (d4x_scheduler_window==NULL) return; GtkTreeSelection *s=gtk_tree_view_get_selection(d4x_scheduler_view); tQueue q; gtk_tree_selection_selected_foreach(s, _foreach_remove_prepare_, &q); tNode *t=q.last(); while(t){ GValue val={0,}; gtk_tree_model_get_value(GTK_TREE_MODEL(d4x_scheduler_store),((tmpIterNode*)t)->iter,3,&val); d4xSchedAction *act=(d4xSchedAction *)g_value_get_pointer(&val); g_value_unset(&val); MainScheduler->del_action(act); t=t->next; }; }; gint d4x_scheduler_close() { if (!d4x_scheduler_window) return(FALSE); gtk_widget_destroy(d4x_scheduler_window); d4x_scheduler_window=(GtkWidget *)NULL; return(TRUE); }; void d4x_scheduler_init_editor(){ GtkWidget *tmp=my_gtk_aeditor_new(); // MyGtkAEditor *editor=MY_GTK_AEDITOR(tmp); gtk_widget_show_all(tmp); gtk_window_set_modal (GTK_WINDOW(tmp),TRUE); gtk_window_set_transient_for (GTK_WINDOW (tmp), GTK_WINDOW (MainWindow)); }; static GtkTreeIter *_sel_iter_=(GtkTreeIter *)NULL; static void _foreach_edit_prepare_(GtkTreeModel *model,GtkTreePath *path, GtkTreeIter *iter,gpointer p){ if (_sel_iter_) gtk_tree_iter_free(_sel_iter_); _sel_iter_=gtk_tree_iter_copy(iter); }; void d4x_scheduler_edit(){ if (d4x_scheduler_window==NULL) return; GtkTreeSelection *s=gtk_tree_view_get_selection(d4x_scheduler_view); gtk_tree_selection_selected_foreach(s, _foreach_edit_prepare_, NULL); if (_sel_iter_){ GValue val={0,}; gtk_tree_model_get_value(GTK_TREE_MODEL(d4x_scheduler_store),_sel_iter_,3,&val); d4xSchedAction *act=(d4xSchedAction *)g_value_get_pointer(&val); g_value_unset(&val); if (act && act->lock==0){ act->lock=1; GtkWidget *tmp=my_gtk_aeditor_new(act); gtk_widget_show_all(tmp); gtk_window_set_modal (GTK_WINDOW(tmp),TRUE); gtk_window_set_transient_for (GTK_WINDOW (tmp), GTK_WINDOW (MainWindow)); }; gtk_tree_iter_free(_sel_iter_); }; _sel_iter_=(GtkTreeIter *)NULL; }; gint d4x_scheduler_select(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data, gpointer nothing){ if (event && event->type==GDK_2BUTTON_PRESS && event->button==1){ d4x_scheduler_edit(); }; return(TRUE); }; GtkWidget *d4x_scheduler_init(){ if (d4x_scheduler_window) { return(d4x_scheduler_window); }; gchar *titles[]={_("Time"),_("Action"),_("Info")}; GtkListStore *list_store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); d4x_scheduler_store=list_store; d4x_scheduler_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store))); gtk_tree_view_set_headers_visible(d4x_scheduler_view,TRUE); GtkCellRenderer *renderer; GtkTreeViewColumn *col; for (int i=0;i<3;i++){ renderer = gtk_cell_renderer_text_new(); col=gtk_tree_view_column_new_with_attributes(_(titles[i]), renderer, "text",i, NULL); gtk_tree_view_column_set_visible(col,TRUE); gtk_tree_view_append_column(d4x_scheduler_view,col); }; // gtk_clist_set_selection_mode(GTK_CLIST(d4x_scheduler_clist),GTK_SELECTION_EXTENDED); // g_signal_connect(G_OBJECT(d4x_scheduler_clist), "select_row", // G_CALLBACK(d4x_scheduler_select),NULL); GtkWidget *scroll_window=gtk_scrolled_window_new((GtkAdjustment *)NULL,(GtkAdjustment *)NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_window), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(scroll_window),GTK_WIDGET(d4x_scheduler_view)); GtkWidget *add_button=gtk_button_new_from_stock(GTK_STOCK_ADD); GtkWidget *edit_button=gtk_button_new_from_stock(GTK_STOCK_PROPERTIES); GtkWidget *del_button=gtk_button_new_from_stock(GTK_STOCK_REMOVE); GTK_WIDGET_SET_FLAGS(edit_button,GTK_CAN_DEFAULT); GTK_WIDGET_SET_FLAGS(add_button,GTK_CAN_DEFAULT); GTK_WIDGET_SET_FLAGS(del_button,GTK_CAN_DEFAULT); GtkWidget *vbox=d4x_scheduler_window=gtk_vbox_new(FALSE,5); GtkWidget *label=gtk_label_new(_("Scheduler")); GtkWidget *hbox=gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox),GTK_BUTTONBOX_START); gtk_box_set_spacing(GTK_BOX(hbox),3); gtk_box_pack_start(GTK_BOX(vbox),my_gtk_set_header_style(label),FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),scroll_window,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(hbox),add_button,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(hbox),del_button,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(hbox),edit_button,FALSE,FALSE,0); MainScheduler->redraw(); g_signal_connect(G_OBJECT(add_button),"clicked",G_CALLBACK(d4x_scheduler_init_editor),NULL); g_signal_connect(G_OBJECT(del_button),"clicked",G_CALLBACK(d4x_scheduler_remove_selected),NULL); g_signal_connect(G_OBJECT(edit_button),"clicked",G_CALLBACK(d4x_scheduler_edit),NULL); gtk_widget_ref(d4x_scheduler_window); return(d4x_scheduler_window); }; /*********************************************************************/ static GtkWidgetClass *parent_class2 = (GtkWidgetClass *)NULL; static void my_gtk_aeditor_edit_ok(GtkWidget *widget,MyGtkAEditor *editor){ tDownload *what=editor->dwn; what->editor->apply_changes(); what->delete_editor(); text_to_combo(editor->url_entry,std::string(editor->dwn->info).c_str()); }; static void my_gtk_aeditor_edit_download(GtkWidget *widget,MyGtkAEditor *editor){ tDownload *what; int flag=0; if (editor->dwn==NULL){ editor->dwn=new tDownload; char *url_entry_cont=text_from_combo(editor->url_entry); editor->dwn->info=std::string(url_entry_cont); if (url_entry_cont==NULL || *url_entry_cont==0) flag=1; }; if (editor->dwn->config==NULL){ editor->dwn->config=new tCfg; editor->dwn->set_default_cfg(); editor->dwn->config->save_path.set(CFG.GLOBAL_SAVE_PATH); }; what=editor->dwn; init_edit_window_without_ok(what,1); what->editor->disable_time(); if (flag) what->editor->clear_url(); gtk_window_set_modal (GTK_WINDOW(what->editor->window),TRUE); gtk_window_set_transient_for (GTK_WINDOW (what->editor->window), GTK_WINDOW (editor)); g_signal_connect(G_OBJECT(what->editor->ok_button),"clicked", G_CALLBACK(my_gtk_aeditor_edit_ok), editor); }; static void my_gtk_aeditor_browse_ok(GtkWidget *widget,MyGtkAEditor *editor){ text_to_combo(editor->path_entry, gtk_file_selection_get_filename(GTK_FILE_SELECTION(editor->browser))); gtk_widget_destroy(editor->browser); }; static void my_gtk_aeditor_browse_cancel(GtkWidget *widget,MyGtkAEditor *editor){ gtk_widget_destroy(editor->browser); }; static gint my_gtk_aeditor_browse_delete(GtkWidget *window,GdkEvent *event, MyGtkAEditor *editor) { gtk_widget_destroy(editor->browser); return TRUE; }; static void my_gtk_aeditor_browse(GtkWidget *widget,MyGtkAEditor *editor){ GtkWidget *browser=gtk_file_selection_new(_("Select file")); char *tmp=text_from_combo(editor->path_entry); if (tmp && *tmp) gtk_file_selection_set_filename(GTK_FILE_SELECTION(browser),tmp); g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(browser)->ok_button), "clicked",G_CALLBACK(my_gtk_aeditor_browse_ok),editor); g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(browser)->cancel_button), "clicked",G_CALLBACK(my_gtk_aeditor_browse_cancel),editor); g_signal_connect(G_OBJECT(browser), "delete_event",G_CALLBACK(my_gtk_aeditor_browse_delete),editor); d4x_eschandler_init(GTK_WIDGET(browser),editor); editor->browser=browser; gtk_widget_show(browser); gtk_window_set_modal (GTK_WINDOW(browser),TRUE); gtk_window_set_transient_for (GTK_WINDOW (browser), GTK_WINDOW(editor)); }; static int _is_sa_url_(int type){ if (type==SACT_DELETE_DOWNLOAD || type==SACT_PAUSE_DOWNLOAD || type==SACT_RUN_DOWNLOAD || type==SACT_DEL_IF_COMPLETED) return(1); return(0); }; static void aeditor_select_mode_int(MyGtkAEditor *editor,int i){ if (editor->last_action!=i){ switch(editor->last_action){ case SACT_RUN_DOWNLOAD: case SACT_PAUSE_DOWNLOAD: case SACT_DEL_IF_COMPLETED: case SACT_DELETE_DOWNLOAD:{ if (_is_sa_url_(i)){ editor->last_action=i; return; }; }; default: /* these actions have no properties */ if (editor->frame_child){ gtk_widget_destroy(editor->frame_child); }; break; }; switch(i){ case SACT_SET_SPEED:{ GtkWidget *hbox=gtk_hbox_new(FALSE,5); editor->frame_child=hbox; editor->sb_low=gtk_radio_button_new_with_label((GSList *)NULL, _(SPEED_LIMITATIONS_NAMES[1])); gtk_box_pack_start(GTK_BOX(hbox),editor->sb_low, FALSE,FALSE,0); GSList *group1=gtk_radio_button_get_group(GTK_RADIO_BUTTON(editor->sb_low)); editor->sb_middle=gtk_radio_button_new_with_label(group1, _(SPEED_LIMITATIONS_NAMES[2])); gtk_box_pack_start(GTK_BOX(hbox),editor->sb_middle, FALSE,FALSE,0); editor->sb_high=gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(editor->sb_middle)),_(SPEED_LIMITATIONS_NAMES[3])); gtk_box_pack_start(GTK_BOX(hbox), editor->sb_high,FALSE,FALSE,0); gtk_container_add(GTK_CONTAINER(editor->frame),hbox); if (editor->action){ d4xSASpeed *act=(d4xSASpeed *)(editor->action); if (act->speed==1) g_signal_emit_by_name(G_OBJECT(editor->sb_low), "clicked"); else g_signal_emit_by_name(act->speed==2?G_OBJECT(editor->sb_middle):G_OBJECT(editor->sb_high), "clicked"); }; break; }; case SACT_RUN_DOWNLOAD: case SACT_PAUSE_DOWNLOAD: case SACT_DEL_IF_COMPLETED: case SACT_DELETE_DOWNLOAD:{ editor->url_entry=my_gtk_combo_new(ALL_HISTORIES[URL_HISTORY]);//gtk_entry_new(); GtkWidget *hbox=gtk_hbox_new(FALSE,5); editor->frame_child=hbox; gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("URL:"), FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->url_entry, TRUE,TRUE,0); gtk_container_add(GTK_CONTAINER(editor->frame),hbox); if (editor->action && _is_sa_url_(editor->action->type())){ d4xSAUrl *act=(d4xSAUrl *)(editor->action); if (act->url.is_valid()){ text_to_combo(editor->url_entry,std::string(act->url).c_str()); }; }; break; }; case SACT_ADD_DOWNLOAD:{ editor->url_entry=my_gtk_combo_new(ALL_HISTORIES[URL_HISTORY]);//gtk_entry_new(); GtkWidget *hbox=gtk_hbox_new(FALSE,5); editor->frame_child=hbox; gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("URL:"), FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->url_entry, TRUE,TRUE,0); if (editor->dwn==NULL && editor->action && editor->action->type()==SACT_ADD_DOWNLOAD){ d4xSAAddDownload *a=(d4xSAAddDownload *)editor->action; editor->dwn=new tDownload; editor->dwn->copy(a->dwn); }; if (editor->dwn){ if (editor->dwn && editor->dwn->info.is_valid()){ text_to_combo(editor->url_entry,std::string(editor->dwn->info).c_str()); }else text_to_combo(editor->url_entry,""); }else text_to_combo(editor->url_entry,""); GtkWidget *button=gtk_button_new_from_stock(GTK_STOCK_PROPERTIES); g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(my_gtk_aeditor_edit_download), editor); gtk_box_pack_start(GTK_BOX(hbox),button, FALSE,FALSE,0); gtk_container_add(GTK_CONTAINER(editor->frame),hbox); break; }; case SACT_EXECUTE:{ editor->path_entry=gtk_entry_new(); GtkWidget *hbox=gtk_hbox_new(FALSE,5); editor->frame_child=hbox; gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("Command:")), FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->path_entry, TRUE,TRUE,0); GtkWidget *button=gtk_button_new_with_label(_("Browse")); g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(my_gtk_aeditor_browse),editor); gtk_box_pack_start(GTK_BOX(hbox),button, FALSE,FALSE,0); gtk_container_add(GTK_CONTAINER(editor->frame),hbox); if (editor->action && editor->action->type()==SACT_EXECUTE){ d4xSAExecute *a=(d4xSAExecute *)editor->action; text_to_combo(editor->path_entry,a->command.get()); }else text_to_combo(editor->path_entry,""); break; }; case SACT_SAVE_LIST:{ editor->path_entry=my_gtk_combo_new(ALL_HISTORIES[LOAD_SAVE_HISTORY]);//gtk_entry_new(); GtkWidget *hbox=gtk_hbox_new(FALSE,5); editor->frame_child=hbox; gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("Path:")), FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->path_entry, TRUE,TRUE,0); GtkWidget *button=gtk_button_new_with_label(_("Browse")); g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(my_gtk_aeditor_browse),editor); gtk_box_pack_start(GTK_BOX(hbox),button, FALSE,FALSE,0); gtk_container_add(GTK_CONTAINER(editor->frame),hbox); // gtk_container_add(GTK_CONTAINER(editor->frame),editor->path_entry); if (editor->action && editor->action->type()==SACT_SAVE_LIST){ d4xSASaveList *a=(d4xSASaveList *)editor->action; text_to_combo(editor->path_entry,a->path.get()); }else text_to_combo(editor->path_entry,""); break; }; default: editor->frame_child=gtk_label_new(_("This action has no properties")); gtk_container_add(GTK_CONTAINER(editor->frame), editor->frame_child); break; }; editor->last_action=i; gtk_widget_show_all(editor->frame_child); }; }; static void aeditor_select_mode(GtkWidget *widget,MyGtkAEditor *editor){ aeditor_select_mode_int(editor,gtk_combo_box_get_active(GTK_COMBO_BOX(widget))); /* GSList *group=gtk_radio_menu_item_get_group((GtkRadioMenuItem *)widget); int i=0; while(group && !((GtkCheckMenuItem *)(group->data))->active){ group = group->next; i++; }; i=SACT_LAST-i-1; aeditor_select_mode_int(editor,i); */ }; static GtkWidget *my_option_menu (char *labels[], gint num_items, gint active, gpointer data){ GtkWidget *combo_box = gtk_combo_box_new_text (); for (int i=0;idwn){ delete(editor->dwn); editor->dwn=NULL; }; if (editor->action) editor->action->lock=0; if (GTK_OBJECT_CLASS (parent_class2)->destroy) (* GTK_OBJECT_CLASS (parent_class2)->destroy) (widget); }; static void my_gtk_aeditor_class_init(MyGtkAEditorClass *klass){ GtkObjectClass *object_class=(GtkObjectClass *)klass; object_class->destroy=my_gtk_aeditor_destroy; parent_class2=(GtkWidgetClass *)gtk_type_class(gtk_window_get_type()); }; static void my_gtk_aeditor_ok(GtkWidget *widget,MyGtkAEditor *editor){ if (editor->action){ MainScheduler->del_action(editor->action); delete(editor->action); }; time_t start_time; time_t period=0; int retries=0; /* preparing time */ time_t NOW=time((time_t*)NULL); struct tm date; date.tm_isdst=-1; localtime_r(&NOW,&date); sscanf(text_from_combo(editor->hour),"%i",&date.tm_hour); sscanf(text_from_combo(editor->min),"%i",&date.tm_min); sscanf(text_from_combo(editor->sec),"%i",&date.tm_sec); gtk_calendar_get_date(GTK_CALENDAR(editor->calendar), (guint *)&date.tm_year, (guint *)&date.tm_mon, (guint *)&date.tm_mday); date.tm_year-=1900; start_time=mktime(&date); if (GTK_TOGGLE_BUTTON(editor->retry)->active){ int days,hours,mins; sscanf(text_from_combo(editor->retry_times),"%i",&retries); sscanf(text_from_combo(editor->period_days),"%i",&days); sscanf(text_from_combo(editor->period_hours),"%i",&hours); sscanf(text_from_combo(editor->period_mins),"%i",&mins); period=days*24*3600+hours*3600+mins*60; if (period==0) period=60; }else{ retries=0; }; /*********************/ d4xSchedAction *action=(d4xSchedAction *)NULL; switch(editor->last_action){ case SACT_SET_SPEED:{ d4xSASpeed *act=new d4xSASpeed; action=act; if (GTK_TOGGLE_BUTTON(editor->sb_low)->active) act->speed=1; else{ act->speed=GTK_TOGGLE_BUTTON(editor->sb_middle)->active?2:3; }; break; }; case SACT_POPUP_WINDOW:{ d4xSAPopup *act=new d4xSAPopup; action=act; break; }; case SACT_EXIT:{ d4xSAExit *act=new d4xSAExit; action=act; break; }; case SACT_DEL_COMPLETED:{ d4xSADelCompleted *act=new d4xSADelCompleted; action=act; break; }; case SACT_DEL_FAILED:{ d4xSADelFailed *act=new d4xSADelFailed; action=act; break; }; case SACT_RUN_DOWNLOAD:{ d4xSARunDownload *act=new d4xSARunDownload; act->url=std::string(text_from_combo(editor->url_entry)); action=act; break; }; case SACT_PAUSE_DOWNLOAD:{ d4xSAStopDownload *act=new d4xSAStopDownload; act->url=std::string(text_from_combo(editor->url_entry)); action=act; break; }; case SACT_DELETE_DOWNLOAD:{ d4xSADelDownload *act=new d4xSADelDownload; act->url=std::string(text_from_combo(editor->url_entry)); action=act; break; }; case SACT_SAVE_LIST:{ d4xSASaveList *act=new d4xSASaveList; act->path.set(text_from_combo(editor->path_entry)); action=act; break; }; case SACT_EXECUTE:{ d4xSAExecute *act=new d4xSAExecute; act->command.set(text_from_combo(editor->path_entry)); action=act; break; }; case SACT_ADD_DOWNLOAD:{ d4xSAAddDownload *act=new d4xSAAddDownload; if (act->dwn) delete(act->dwn); if (editor->dwn==NULL){ editor->dwn=new tDownload; editor->dwn->config=new tCfg; editor->dwn->set_default_cfg(); editor->dwn->config->save_path.set(CFG.GLOBAL_SAVE_PATH); editor->dwn->info=std::string(text_from_combo(editor->url_entry)); }; act->dwn=editor->dwn; editor->dwn=(tDownload*)NULL; action=act; break; }; case SACT_DEL_IF_COMPLETED:{ d4xSADelIfCompleted *act=new d4xSADelIfCompleted; act->url=std::string(text_from_combo(editor->url_entry)); action=act; break; }; }; if (action){ action->start_time=start_time; action->period=period; action->retries=retries; MainScheduler->add_action(action); }; gtk_widget_destroy(GTK_WIDGET(editor)); }; static void my_gtk_aeditor_cancel(GtkWidget *widget,GtkWidget *editor){ printf("my_gtk_aeditor_cancel\n"); gtk_widget_destroy(editor); printf("/my_gtk_aeditor_cancel\n"); }; static void my_gtk_aeditor_close(GtkWidget *widget,GdkEvent *event,GtkWidget *editor){ printf("my_gtk_aeditor_close\n"); gtk_widget_destroy(editor); printf("/my_gtk_aeditor_close\n"); }; static void my_gtk_aeditor_retry_cb(GtkWidget *widget,MyGtkAEditor *editor){ gtk_widget_set_sensitive(editor->retry_times,GTK_TOGGLE_BUTTON(widget)->active); gtk_widget_set_sensitive(editor->period_days,GTK_TOGGLE_BUTTON(widget)->active); gtk_widget_set_sensitive(editor->period_hours,GTK_TOGGLE_BUTTON(widget)->active); gtk_widget_set_sensitive(editor->period_mins,GTK_TOGGLE_BUTTON(widget)->active); // gtk_widget_set_sensitive(editor->,GTK_TOGGLE_BUTTON(widget)->active); }; static void my_gtk_aeditor_init(MyGtkAEditor *editor){ GtkWidget *vbox=gtk_vbox_new(FALSE,0); editor->last_action=-1; //no last actions editor->dwn=(tDownload *)NULL; editor->action=(d4xSchedAction *)NULL; editor->frame_child=(GtkWidget *)NULL; editor->hbox=gtk_hbox_new(FALSE,5); gtk_box_set_spacing(GTK_BOX(vbox),5); editor->omenu = my_option_menu (action_names, sizeof(action_names)/sizeof(char*), 0, editor); GtkWidget *hbox=gtk_hbox_new(FALSE,1); GtkWidget *label=gtk_label_new(_("Start time(hour:min:sec)")); editor->hour=my_gtk_entry_new_with_max_length(2,0); editor->min=my_gtk_entry_new_with_max_length(2,0); editor->sec=my_gtk_entry_new_with_max_length(2,0); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->hour,FALSE,FALSE,0); label=gtk_label_new(":"); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->min,FALSE,FALSE,0); label=gtk_label_new(":"); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->sec,FALSE,FALSE,0); GtkWidget *tmpvbox=gtk_vbox_new(FALSE,5); editor->calendar=gtk_calendar_new(); gtk_calendar_set_display_options(GTK_CALENDAR(editor->calendar), GtkCalendarDisplayOptions( GTK_CALENDAR_WEEK_START_MONDAY | GTK_CALENDAR_SHOW_DAY_NAMES| GTK_CALENDAR_SHOW_HEADING)); gtk_box_pack_start(GTK_BOX(tmpvbox),hbox,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(tmpvbox),editor->calendar,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(editor->hbox),tmpvbox,FALSE,FALSE,0); tmpvbox=gtk_vbox_new(FALSE,5); editor->retry=gtk_check_button_new_with_label(_("Retry this action")); g_signal_connect(G_OBJECT(editor->retry),"clicked", G_CALLBACK(my_gtk_aeditor_retry_cb),editor); gtk_box_pack_start (GTK_BOX (tmpvbox),editor->retry,FALSE, FALSE, 0); hbox=gtk_hbox_new(FALSE,5); editor->retry_times=my_gtk_entry_new_with_max_length(2,1); gtk_box_pack_start (GTK_BOX (hbox),editor->retry_times,FALSE, FALSE, 0); label=gtk_label_new(_("times to repeat (-1 unlimited)")); gtk_box_pack_start (GTK_BOX (hbox),label,FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (tmpvbox),hbox,FALSE, FALSE, 0); label=gtk_label_new(_("period (day/hour:min)")); hbox=gtk_hbox_new(FALSE,1); editor->period_hours=my_gtk_entry_new_with_max_length(2,0); editor->period_mins=my_gtk_entry_new_with_max_length(2,0); editor->period_days=my_gtk_entry_new_with_max_length(2,0); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->period_days,FALSE,FALSE,0); label=gtk_label_new("/"); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->period_hours,FALSE,FALSE,0); label=gtk_label_new(":"); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),editor->period_mins,FALSE,FALSE,0); gtk_box_pack_start (GTK_BOX (tmpvbox),hbox,FALSE, FALSE, 0); GtkWidget *frame=gtk_frame_new(_("Action")); gtk_container_set_border_width(GTK_CONTAINER(frame),5); gtk_container_add(GTK_CONTAINER(frame),editor->omenu); gtk_box_pack_end(GTK_BOX (tmpvbox),frame,FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(editor->hbox),tmpvbox,FALSE,TRUE,0); gtk_box_pack_start(GTK_BOX(vbox),editor->hbox,FALSE,TRUE,0); editor->frame=gtk_frame_new(_("Properties")); gtk_container_set_border_width(GTK_CONTAINER(editor->frame),5); gtk_box_pack_start(GTK_BOX(vbox),editor->frame,FALSE,TRUE,0); hbox=gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(hbox),5); GtkWidget *ok_button=gtk_button_new_from_stock(GTK_STOCK_OK); GtkWidget *cancel_button=gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_box_pack_end(GTK_BOX(hbox),ok_button,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(hbox),cancel_button,FALSE,FALSE,0); g_signal_connect(G_OBJECT(ok_button),"clicked", G_CALLBACK(my_gtk_aeditor_ok),editor); g_signal_connect(G_OBJECT(cancel_button),"clicked", G_CALLBACK(my_gtk_aeditor_cancel),editor); g_signal_connect(G_OBJECT(editor),"delete_event", G_CALLBACK(my_gtk_aeditor_close), editor); d4x_eschandler_init(GTK_WIDGET(editor),editor); gtk_box_pack_start (GTK_BOX (vbox),hbox, FALSE, TRUE, 0); gtk_window_set_title(GTK_WINDOW(editor),_("Edit scheduled action")); gtk_window_set_position(GTK_WINDOW(editor),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(editor),5); gtk_container_add(GTK_CONTAINER(editor),vbox); }; guint my_gtk_aeditor_get_type(){ static guint my_aeditor_type=0; if (!my_aeditor_type){ GTypeInfo my_aeditor_info={ sizeof(MyGtkAEditorClass), NULL, NULL, (GClassInitFunc)my_gtk_aeditor_class_init, NULL, NULL, sizeof(MyGtkAEditor), 0, (GInstanceInitFunc)my_gtk_aeditor_init }; my_aeditor_type =g_type_register_static (GTK_TYPE_WINDOW,"MyGtkAEditor",&my_aeditor_info,(GTypeFlags)0); }; return my_aeditor_type; }; GtkWidget *my_gtk_aeditor_new(d4xSchedAction *action){ MyGtkAEditor *editor=(MyGtkAEditor *)g_object_new(my_gtk_aeditor_get_type(),NULL); char data[MAX_LEN]; if (action){ struct tm date; localtime_r(&(action->start_time),&date); sprintf(data,"%i",date.tm_hour); text_to_combo(editor->hour,data); sprintf(data,"%i",date.tm_min); text_to_combo(editor->min,data); sprintf(data,"%i",date.tm_sec); text_to_combo(editor->sec,data); gtk_calendar_select_month(GTK_CALENDAR(editor->calendar),date.tm_mon,date.tm_year+1900); gtk_calendar_select_day(GTK_CALENDAR(editor->calendar),date.tm_mday); if (action->retries){ sprintf(data,"%i",action->retries); text_to_combo(editor->retry_times,data); int mins,days,hours; GTK_TOGGLE_BUTTON(editor->retry)->active=TRUE; mins=(action->period%3600)/60; days=action->period/(3600*24); hours=(action->period%(3600*24))/3600; sprintf(data,"%i",mins); text_to_combo(editor->period_mins,data); sprintf(data,"%i",hours); text_to_combo(editor->period_hours,data); sprintf(data,"%i",days); text_to_combo(editor->period_days,data); }; editor->action=action; // gtk_option_menu_set_history (GTK_OPTION_MENU (editor->omenu),action->type()); gtk_combo_box_set_active(GTK_COMBO_BOX(editor->omenu),action->type()); aeditor_select_mode_int(editor,action->type()); }else{ time_t now=time((time_t*)NULL); struct tm date; localtime_r(&now,&date); sprintf(data,"%i",date.tm_hour); text_to_combo(editor->hour,data); sprintf(data,"%i",date.tm_min); text_to_combo(editor->min,data); sprintf(data,"%i",date.tm_sec); text_to_combo(editor->sec,data); gtk_calendar_select_month(GTK_CALENDAR(editor->calendar),date.tm_mon,date.tm_year+1900); gtk_calendar_select_day(GTK_CALENDAR(editor->calendar),date.tm_mday); gtk_combo_box_set_active(GTK_COMBO_BOX(editor->omenu),0); // aeditor_select_mode_int(editor,0); if (editor->action && editor->action->type()==SACT_SET_SPEED){ d4xSASpeed *act=(d4xSASpeed *)(editor->action); if (act->speed==1) g_signal_emit_by_name(G_OBJECT(editor->sb_low),"clicked"); else g_signal_emit_by_name(act->speed==2?G_OBJECT(editor->sb_middle):G_OBJECT(editor->sb_high), "clicked"); }; }; if (!GTK_TOGGLE_BUTTON(editor->retry)->active){ gtk_widget_set_sensitive(editor->retry_times,FALSE); gtk_widget_set_sensitive(editor->period_days,FALSE); gtk_widget_set_sensitive(editor->period_hours,FALSE); gtk_widget_set_sensitive(editor->period_mins,FALSE); }; return GTK_WIDGET(editor); };