/tags/rel-0-1-1/FreeSpeech/vflow/src/main.cc

# · C++ · 626 lines · 339 code · 156 blank · 131 comment · 29 complexity · 601a152f6b68750243d2e28718e6c838 MD5 · raw file

  1. /*
  2. * Initial main.c file generated by Glade. Edit as required.
  3. * Glade will not overwrite this file.
  4. */
  5. #ifdef HAVE_CONFIG_H
  6. # include <config.h>
  7. #endif
  8. #include <gnome.h>
  9. #include "UIDocument.h"
  10. #include "GUIDocument.h"
  11. GnomeMDI *mdi;
  12. GtkWidget *runButton;
  13. GtkWidget *stopButton;
  14. gint remove_doc_cb (GnomeMDI *mdi, GUIDocument *doc)
  15. {
  16. GnomeMessageBox *msgbox;
  17. int ret, *ptr;
  18. char *fname;
  19. //char *msg;
  20. //gE_data *data = g_malloc (sizeof(gE_data));
  21. //fname = (char *)doc->getName().c_str();
  22. //msg = (char *)g_malloc(strlen(fname) + 52);
  23. //sprintf(msg, _(" '%s' has been modified. Do you wish to save it?"), fname);
  24. string msg = " '" + doc->getName() + "' has been modified. Do you wish to save it?";
  25. if (mdi->active_view) {
  26. if (doc->isModified()) {
  27. //if (true) {
  28. msgbox = GNOME_MESSAGE_BOX (gnome_message_box_new (
  29. msg.c_str(),
  30. GNOME_MESSAGE_BOX_QUESTION,
  31. GNOME_STOCK_BUTTON_YES,
  32. GNOME_STOCK_BUTTON_NO,
  33. GNOME_STOCK_BUTTON_CANCEL,
  34. NULL));
  35. gnome_dialog_set_default (GNOME_DIALOG (msgbox), 2);
  36. ret = gnome_dialog_run_and_close (GNOME_DIALOG (msgbox));
  37. switch (ret) {
  38. case 0:
  39. //file_save_cb (NULL, data);
  40. g_print("blargh\n");
  41. case 1:
  42. return TRUE;
  43. default:
  44. return FALSE;
  45. }
  46. }
  47. }
  48. return TRUE;
  49. }
  50. static void new_doc_event (GtkMenuItem *menuitem,
  51. gpointer user_data)
  52. {
  53. GUIDocument *doc = GUIDocument_new ();
  54. gnome_mdi_add_child (mdi, GNOME_MDI_CHILD (doc));
  55. gnome_mdi_add_view (mdi, GNOME_MDI_CHILD (doc));
  56. }
  57. static void file_open_ok_sel(GtkWidget *w, GUIDocument *data)
  58. {
  59. GtkWidget *ssel = GTK_WIDGET(gtk_object_get_user_data(GTK_OBJECT(w)));
  60. gchar *fname = g_strdup(gtk_file_selection_get_filename (GTK_FILE_SELECTION(ssel)));
  61. //UIDocument *doc;
  62. //doc = UIDOCUMENT(mdi->active_child);
  63. if (fname) {
  64. GUIDocument *doc = GUIDocument_new ();
  65. gnome_mdi_add_child (mdi, GNOME_MDI_CHILD (doc));
  66. gnome_mdi_add_view (mdi, GNOME_MDI_CHILD (doc));
  67. doc->setFullPath(fname);
  68. doc->load();
  69. doc->resetModified();
  70. //doc->save();
  71. //doc->resetModified();
  72. }
  73. g_free (fname);
  74. gtk_widget_destroy (GTK_WIDGET (ssel));
  75. ssel = NULL;
  76. }
  77. static gint
  78. file_open_destroy(GtkWidget *w, GtkWidget *sel)
  79. {
  80. gtk_widget_destroy(sel);
  81. //*sel = NULL;
  82. return TRUE;
  83. }
  84. static void open_doc_event (GtkMenuItem *menuitem,
  85. gpointer user_data)
  86. {
  87. GtkWidget *ssel = gtk_file_selection_new("Open file...");
  88. gtk_object_set_user_data(GTK_OBJECT(GTK_FILE_SELECTION(ssel)->ok_button),ssel);
  89. gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ssel)->ok_button),
  90. "clicked", (GtkSignalFunc)file_open_ok_sel,
  91. NULL);
  92. gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ssel)->cancel_button),
  93. "clicked", (GtkSignalFunc)file_open_destroy,
  94. ssel);
  95. gtk_widget_show(ssel);
  96. }
  97. static void close_doc_event (GtkMenuItem *menuitem,
  98. gpointer user_data)
  99. {
  100. GUIDocument *doc;
  101. if (mdi->active_child == NULL)
  102. return;
  103. if (gnome_mdi_remove_child (mdi, mdi->active_child, FALSE)) {
  104. if (mdi->active_child == NULL) {
  105. /*if (!settings->close_doc) {
  106. doc = UIDocument_new ();
  107. gnome_mdi_add_child (mdi, GNOME_MDI_CHILD (doc));
  108. gnome_mdi_add_view (mdi, GNOME_MDI_CHILD (doc));
  109. } else {
  110. g_print ("Er.. Unimplemented alternative!\n");
  111. }*/
  112. }
  113. }
  114. }
  115. //static GtkWidget *ssel = NULL;
  116. static void file_saveas_ok_sel(GtkWidget *w, GUIDocument *data)
  117. {
  118. GtkWidget *ssel = GTK_WIDGET(gtk_object_get_user_data(GTK_OBJECT(w)));
  119. gchar *fname = g_strdup(gtk_file_selection_get_filename (GTK_FILE_SELECTION(ssel)));
  120. GUIDocument *doc;
  121. if (mdi->active_child == NULL) {
  122. g_free (fname);
  123. return;
  124. }
  125. doc = GUIDOCUMENT(mdi->active_child);
  126. if (fname) {
  127. //cerr << "saving " << doc->getName() << " to " << (char *)fname << endl;
  128. doc->setFullPath(fname);
  129. doc->save();
  130. doc->resetModified();
  131. //if (gE_file_save(doc, fname) != 0)
  132. //gnome_app_flash (mdi->active_window, _("Error saving file!"));
  133. }
  134. g_free (fname);
  135. gtk_widget_destroy (GTK_WIDGET (ssel));
  136. ssel = NULL;
  137. }
  138. static gint
  139. file_saveas_destroy(GtkWidget *w, GtkWidget *sel)
  140. {
  141. gtk_widget_destroy(sel);
  142. //*sel = NULL;
  143. return TRUE;
  144. }
  145. static void saveas_doc_event(GtkWidget *widget, char * cbdata)
  146. {
  147. gchar *title;
  148. //GtkWidget *ssel;
  149. if (mdi->active_child == NULL) {
  150. return;
  151. }
  152. title = g_strdup_printf (_("Save %s As..."), (gchar*)GUIDOCUMENT(mdi->active_child)->getName().c_str());
  153. GtkWidget *ssel = gtk_file_selection_new(title);
  154. gtk_object_set_user_data(GTK_OBJECT(GTK_FILE_SELECTION(ssel)->ok_button),ssel);
  155. gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ssel)->ok_button),
  156. "clicked", (GtkSignalFunc)file_saveas_ok_sel,
  157. NULL);
  158. gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ssel)->cancel_button),
  159. "clicked", (GtkSignalFunc)file_saveas_destroy,
  160. ssel);
  161. gtk_widget_show(ssel);
  162. g_free (title);
  163. }
  164. static void save_doc_event(GtkWidget *widget, char * cbdata)
  165. {
  166. if (mdi->active_child == NULL) {
  167. return;
  168. }
  169. GUIDocument *doc = GUIDOCUMENT(mdi->active_child);
  170. if (doc->isUntitled())
  171. {
  172. saveas_doc_event(widget, cbdata);
  173. return;
  174. }
  175. if (doc->isModified())
  176. doc->save();
  177. doc->resetModified();
  178. }
  179. static void export_doc_event(GtkWidget *widget, char * cbdata)
  180. {
  181. if (mdi->active_child == NULL) {
  182. return;
  183. }
  184. GUIDocument *doc = GUIDOCUMENT(mdi->active_child);
  185. if (doc->isUntitled())
  186. {
  187. saveas_doc_event(widget, cbdata);
  188. //return;
  189. }
  190. if (doc->isModified())
  191. doc->save();
  192. doc->resetModified();
  193. doc->export2net();
  194. }
  195. static void run_arg_cb(gchar * str, string *str2)
  196. {
  197. *str2=str;
  198. }
  199. void set_run_mode (bool isRuning)
  200. {
  201. GtkWidget *w = gnome_mdi_get_toolbar_info (gnome_mdi_get_active_window(mdi))[5].widget;
  202. gtk_widget_set_sensitive(w,!isRuning);
  203. w = gnome_mdi_get_toolbar_info (gnome_mdi_get_active_window(mdi))[6].widget;
  204. gtk_widget_set_sensitive(w,isRuning);
  205. }
  206. static void run_doc_event(GtkWidget *widget, char * cbdata)
  207. {
  208. GUIDocument *doc = GUIDOCUMENT(mdi->active_child);
  209. set_run_mode(true);
  210. doc->threadRun();
  211. }
  212. static void doc_prop_event(GtkWidget *widget, char *cbdata) {
  213. GUIDocument *doc = GUIDOCUMENT(mdi->active_child);
  214. doc->showParams();
  215. }
  216. static void stop_doc_event(GtkWidget *widget, char *cbdata) {
  217. //verify if will are still running the network
  218. //cerr<<"Stopping the thread!"<<endl;
  219. GUIDocument::threadStop();
  220. //cerr<<"Updating the buttons (main)"<<endl;
  221. //set_run_mode(false);
  222. //cerr<<"Done!"<<endl;
  223. }
  224. /*
  225. static void run_doc_event(GtkWidget *widget, char * cbdata)
  226. {
  227. if (mdi->active_child == NULL) {
  228. return;
  229. }
  230. GUIDocument *doc = GUIDOCUMENT(mdi->active_child);
  231. export_doc_event(widget,cbdata);
  232. static string args;
  233. GtkWidget *dialog = gnome_request_dialog (FALSE, "Arguments to pass?", args.c_str(),
  234. 20, run_arg_cb, &args, NULL);
  235. gnome_dialog_run_and_close(GNOME_DIALOG(dialog));
  236. string command = "xterm -e sh -c 'AudioNetwork " + doc->getPath() + doc->getName() + "et " + args + "; sleep 1000' &";
  237. cerr << command << endl;
  238. system (command.c_str());
  239. }
  240. */
  241. static void exit_event (GtkMenuItem *menuitem,
  242. gpointer user_data)
  243. {
  244. //cout<<"exiting..."<<endl;
  245. if (gnome_mdi_remove_all(mdi,FALSE))
  246. {
  247. gtk_object_destroy (GTK_OBJECT (mdi));
  248. } else {
  249. return;
  250. }
  251. gtk_main_quit();
  252. }
  253. static void about_event (GtkMenuItem *menuitem,
  254. gpointer user_data)
  255. {
  256. const gchar *authors[] = {
  257. "Jean-Marc Valin (valj01@gel.usherb.ca)", "Dominic Letourneau (letd01@gel.usherb.ca)",
  258. NULL
  259. };
  260. GtkWidget *about;
  261. about = gnome_about_new ("vflow", VERSION,
  262. _("(C) 1999-2000 Jean-Marc Valin & Dominic Letourneau"),
  263. authors,
  264. _("A visual data flow language. This software is part of the Open Mind Speech Recognition project (http://freespeech.on.openproject.net/)."),
  265. NULL);
  266. gtk_object_set_data (GTK_OBJECT (about), "about", about);
  267. gtk_window_set_modal (GTK_WINDOW (about), TRUE);
  268. gtk_widget_show (about);
  269. //cerr << "here\n";
  270. }
  271. GnomeUIInfo toolbar_data[] = {
  272. { GNOME_APP_UI_ITEM, N_("New"), N_("Create a new document"), new_doc_event,
  273. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_NEW },
  274. { GNOME_APP_UI_ITEM, N_("Open"), N_("Open a file"), open_doc_event,
  275. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_OPEN },
  276. { GNOME_APP_UI_ITEM, N_("Save"), N_("Save the current file"), save_doc_event,
  277. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_SAVE },
  278. /* { GNOME_APP_UI_ITEM, N_("Save As"), N_("Save the current file as..."), saveas_doc_event,
  279. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_SAVE_AS },
  280. { GNOME_APP_UI_ITEM, N_("Close"), N_("Close the current file"), close_doc_event,
  281. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_CLOSE },
  282. */
  283. GNOMEUIINFO_SEPARATOR,
  284. /*{ GNOME_APP_UI_ITEM, N_("Export"), N_("Export to a .net file"), export_doc_event,
  285. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_CONVERT },*/
  286. { GNOME_APP_UI_ITEM, N_("Parameters"), N_("Specify document parameters"), doc_prop_event,
  287. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_PROPERTIES },
  288. { GNOME_APP_UI_ITEM, N_("Run"), N_("Run the current document"), run_doc_event,
  289. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_EXEC },
  290. { GNOME_APP_UI_ITEM, N_("Stop"), N_("Stop the current document"), stop_doc_event,
  291. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_STOP },
  292. //{ GNOME_APP_UI_ITEM, N_("Print"), N_("Print the current file"), file_print_cb,
  293. // NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_PRINT },
  294. /*GNOMEUIINFO_SEPARATOR,
  295. { GNOME_APP_UI_ITEM, N_("Undo"), N_("Undo last operation"), gE_undo_do,
  296. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_UNDO },
  297. { GNOME_APP_UI_ITEM, N_("Redo"), N_("Redo last operation"), gE_undo_redo,
  298. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_REDO },
  299. { GNOME_APP_UI_ITEM, N_("Cut"), N_("Cut the selection"), edit_cut_cb,
  300. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_CUT },
  301. { GNOME_APP_UI_ITEM, N_("Copy"), N_("Copy the selection"), edit_copy_cb,
  302. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_COPY },
  303. { GNOME_APP_UI_ITEM, N_("Paste"), N_("Paste the clipboard"), edit_paste_cb,
  304. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_PASTE },
  305. { GNOME_APP_UI_ITEM, N_("Find"), N_("Search for a string"), search_cb,
  306. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_SEARCH },
  307. { GNOME_APP_UI_ITEM, N_("Line"), N_("Get the current and total lines"), count_lines_cb,
  308. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_INDEX },
  309. */
  310. GNOMEUIINFO_SEPARATOR,
  311. { GNOME_APP_UI_ITEM, N_("Exit"), N_("Exit the program"), exit_event,
  312. NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_QUIT },
  313. GNOMEUIINFO_END
  314. };
  315. static GnomeUIInfo file1_menu_uiinfo[] =
  316. {
  317. GNOMEUIINFO_MENU_NEW_ITEM (N_("_New File"), NULL, new_doc_event, NULL),
  318. GNOMEUIINFO_MENU_OPEN_ITEM (open_doc_event, NULL),
  319. GNOMEUIINFO_MENU_SAVE_ITEM (save_doc_event, NULL),
  320. GNOMEUIINFO_MENU_SAVE_AS_ITEM (saveas_doc_event, NULL),
  321. GNOMEUIINFO_MENU_CLOSE_ITEM (close_doc_event, NULL),
  322. GNOMEUIINFO_SEPARATOR,
  323. GNOMEUIINFO_MENU_EXIT_ITEM (exit_event, NULL),
  324. GNOMEUIINFO_END
  325. };
  326. static GnomeUIInfo edit1_menu_uiinfo[] =
  327. {
  328. /*GNOMEUIINFO_MENU_CUT_ITEM (on_cut1_activate, NULL),
  329. GNOMEUIINFO_MENU_COPY_ITEM (on_copy1_activate, NULL),
  330. GNOMEUIINFO_MENU_PASTE_ITEM (on_paste1_activate, NULL),
  331. GNOMEUIINFO_MENU_CLEAR_ITEM (on_clear1_activate, NULL),
  332. GNOMEUIINFO_SEPARATOR,
  333. GNOMEUIINFO_MENU_PROPERTIES_ITEM (on_properties1_activate, NULL),*/
  334. GNOMEUIINFO_END
  335. };
  336. static GnomeUIInfo view1_menu_uiinfo[] =
  337. {
  338. GNOMEUIINFO_END
  339. };
  340. static GnomeUIInfo settings1_menu_uiinfo[] =
  341. {
  342. //GNOMEUIINFO_MENU_PREFERENCES_ITEM (on_preferences1_activate, NULL),
  343. GNOMEUIINFO_END
  344. };
  345. static GnomeUIInfo help1_menu_uiinfo[] =
  346. {
  347. GNOMEUIINFO_MENU_ABOUT_ITEM (about_event, NULL),
  348. GNOMEUIINFO_END
  349. };
  350. static GnomeUIInfo menubar1_uiinfo[] =
  351. {
  352. GNOMEUIINFO_MENU_FILE_TREE (file1_menu_uiinfo),
  353. GNOMEUIINFO_MENU_EDIT_TREE (edit1_menu_uiinfo),
  354. GNOMEUIINFO_MENU_VIEW_TREE (view1_menu_uiinfo),
  355. GNOMEUIINFO_MENU_SETTINGS_TREE (settings1_menu_uiinfo),
  356. GNOMEUIINFO_MENU_HELP_TREE (help1_menu_uiinfo),
  357. GNOMEUIINFO_END
  358. };
  359. static GtkWidget*
  360. create_mdi ()
  361. {
  362. GUIDocument *doc;
  363. mdi = GNOME_MDI(gnome_mdi_new ("vflow", _("vflow")));
  364. mdi->tab_pos = GTK_POS_TOP;
  365. gtk_object_set_data (GTK_OBJECT (mdi), "mdi", mdi);
  366. gtk_signal_connect(GTK_OBJECT(mdi), "remove_child", GTK_SIGNAL_FUNC(remove_doc_cb), NULL);
  367. //gnome_mdi_set_mode (mdi, GNOME_MDI_DEFAULT_MODE);
  368. gnome_mdi_set_mode (mdi, GNOME_MDI_NOTEBOOK);
  369. gnome_mdi_set_menubar_template (mdi, menubar1_uiinfo);
  370. gnome_mdi_set_toolbar_template (mdi, toolbar_data);
  371. //runButton= toolbar_data[5].widget;
  372. //stopButton= toolbar_data[6].widget;
  373. gnome_mdi_set_child_menu_path (mdi, GNOME_MENU_FILE_STRING);
  374. gnome_mdi_set_child_list_path (mdi, GNOME_MENU_FILES_PATH);
  375. //cerr << "open\n";
  376. gnome_mdi_open_toplevel(mdi);
  377. /*
  378. doc = UIDocument_new ();
  379. gnome_mdi_add_child (mdi, GNOME_MDI_CHILD (doc));
  380. gnome_mdi_add_view (mdi, GNOME_MDI_CHILD (doc));
  381. doc = UIDocument_new ();
  382. gnome_mdi_add_child (mdi, GNOME_MDI_CHILD (doc));
  383. gnome_mdi_add_view (mdi, GNOME_MDI_CHILD (doc));
  384. */
  385. /*GtkWidget *w = gnome_mdi_get_toolbar_info (gnome_mdi_get_active_window(mdi))[6].widget;
  386. gtk_widget_set_sensitive(w,false);*/
  387. set_run_mode(false);
  388. return NULL;
  389. }
  390. #include <sys/types.h>
  391. #include <dirent.h>
  392. #include <dlfcn.h>
  393. #include <signal.h>
  394. //DIR *opendir (const char *name);
  395. //#include <glib.h>
  396. /*void scanDL()
  397. {
  398. string path = "/home/jm/contrat/lib";
  399. DIR *my_directory = opendir (path.c_str());
  400. struct dirent *current_entry;
  401. for (current_entry = readdir(my_directory);
  402. current_entry != NULL; current_entry = readdir(my_directory))
  403. {
  404. string fullname = path + "/" + current_entry->d_name;
  405. dlopen(fullname.c_str(), RTLD_LAZY);
  406. }
  407. closedir(my_directory);
  408. //UIDocument::loadExtDocInfo(files);
  409. }
  410. */
  411. void on_segfault(int sig)
  412. {
  413. if (pthread_equal (GUIDocument::runThread, pthread_self()))
  414. {
  415. cerr << "segfault caught in user program\n";
  416. gdk_threads_enter();
  417. gnome_error_dialog("The user program caused a segmentation violation.\nMemory corruption might have occured, so it is recommended\nto restart Overflow (unless you know what you're doing).");
  418. gdk_threads_leave();
  419. pthread_exit(NULL);
  420. //pthread_cancel (GUIDocument::runThread);
  421. } else {
  422. cerr << "Overflow just crashed... you should have saved :-(\n";
  423. gnome_error_dialog("Overflow just crashed... you should have saved :-(");
  424. gtk_main_quit();
  425. }
  426. }
  427. int
  428. main (int argc, char *argv[])
  429. {
  430. UIDocument::scanDL();
  431. UIDocument::loadExtDocInfo();
  432. GtkWidget *vflow;
  433. g_thread_init(NULL);
  434. gnome_init ("vflow", VERSION, argc, argv);
  435. signal(11,on_segfault);
  436. create_mdi();
  437. if (argc > 1)
  438. {
  439. for (int i=1;i<argc;i++)
  440. {
  441. GUIDocument *doc = GUIDocument_new ();
  442. gnome_mdi_add_child (mdi, GNOME_MDI_CHILD (doc));
  443. gnome_mdi_add_view (mdi, GNOME_MDI_CHILD (doc));
  444. doc->setFullPath(argv[i]);
  445. doc->load();
  446. doc->resetModified();
  447. }
  448. } else {
  449. GUIDocument *doc = GUIDocument_new ();
  450. gnome_mdi_add_child (mdi, GNOME_MDI_CHILD (doc));
  451. gnome_mdi_add_view (mdi, GNOME_MDI_CHILD (doc));
  452. }
  453. //cerr << "gtk_main\n";
  454. gdk_threads_enter();
  455. gtk_main ();
  456. gdk_threads_leave();
  457. return 0;
  458. }