menucallbacks.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. /*************************************************************************
  2. * Copyright (c) 2011 AT&T Intellectual Property
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * https://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors: Details at https://graphviz.org
  9. *************************************************************************/
  10. #include "menucallbacks.h"
  11. #include "viewport.h"
  12. #include "tvnodes.h"
  13. #include "gvprpipe.h"
  14. #include "topviewsettings.h"
  15. #include "gltemplate.h"
  16. #include <common/const.h>
  17. #include <assert.h>
  18. #include <ctype.h>
  19. #include <glib.h>
  20. #include <stdlib.h>
  21. #include "frmobjectui.h"
  22. #include <util/agxbuf.h>
  23. void mAttributesSlot(GtkWidget *widget, void *user_data) {
  24. (void)widget;
  25. (void)user_data;
  26. showAttrsWidget();
  27. }
  28. void mOpenSlot(GtkWidget *widget, void *user_data) {
  29. (void)widget;
  30. (void)user_data;
  31. GtkWidget *dialog;
  32. GtkFileFilter *filter;
  33. filter = gtk_file_filter_new();
  34. gtk_file_filter_add_pattern(filter, "*.gv");
  35. gtk_file_filter_add_pattern(filter, "*.dot");
  36. dialog = gtk_file_chooser_dialog_new("Open File",
  37. NULL,
  38. GTK_FILE_CHOOSER_ACTION_OPEN,
  39. GTK_STOCK_CANCEL,
  40. GTK_RESPONSE_CANCEL,
  41. GTK_STOCK_OPEN,
  42. GTK_RESPONSE_ACCEPT, NULL);
  43. gtk_file_chooser_set_filter((GtkFileChooser *) dialog, filter);
  44. if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
  45. char *filename;
  46. filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
  47. add_graph_to_viewport_from_file(filename);
  48. g_free(filename);
  49. }
  50. gtk_widget_destroy(dialog);
  51. }
  52. void mSaveSlot(GtkWidget *widget, void *user_data) {
  53. (void)widget;
  54. (void)user_data;
  55. save_graph(); //save without prompt
  56. }
  57. void mSaveAsSlot(GtkWidget *widget, void *user_data) {
  58. (void)widget;
  59. (void)user_data;
  60. save_as_graph(); //save with prompt
  61. }
  62. void mCloseSlot(GtkWidget *widget, void *user_data) {
  63. (void)widget;
  64. (void)user_data;
  65. if (view->activeGraph == 0)
  66. close_graph(view);
  67. }
  68. void mOptionsSlot(GtkWidget *widget, void *user_data) {
  69. (void)widget;
  70. (void)user_data;
  71. }
  72. void mQuitSlot(GtkWidget *widget, void *user_data) {
  73. (void)widget;
  74. (void)user_data;
  75. close_graph(view);
  76. gtk_main_quit();
  77. }
  78. //edit
  79. void mCutSlot(GtkWidget *widget, void *user_data) {
  80. (void)widget;
  81. (void)user_data;
  82. }
  83. void mCopySlot(GtkWidget *widget, void *user_data) {
  84. (void)widget;
  85. (void)user_data;
  86. }
  87. void mPasteSlot(GtkWidget *widget, void *user_data) {
  88. (void)widget;
  89. (void)user_data;
  90. }
  91. void mDeleteSlot(GtkWidget *widget, void *user_data) {
  92. (void)widget;
  93. (void)user_data;
  94. }
  95. void mTopviewSettingsSlot(GtkWidget *widget, void *user_data) {
  96. (void)widget;
  97. (void)user_data;
  98. show_settings_form();
  99. }
  100. //view
  101. void mShowToolBoxSlot(GtkWidget *widget, void *user_data) {
  102. (void)widget;
  103. (void)user_data;
  104. if (!gtk_widget_set_gl_capability
  105. (glade_xml_get_widget(xml, "glfixed"), configure_gl(),
  106. gtk_widget_get_gl_context(view->drawing_area), 0, 0))
  107. printf("glwidget creation failed \n");
  108. }
  109. void mShowConsoleSlot(GtkWidget *widget, void *user_data) {
  110. (void)widget;
  111. (void)user_data;
  112. static int state = 0; // off by default
  113. if (state) {
  114. gtk_widget_hide (glade_xml_get_widget(xml, "vbox13"));
  115. gtk_widget_show (glade_xml_get_widget(xml, "show_console1"));
  116. gtk_widget_hide (glade_xml_get_widget(xml, "hide_console1"));
  117. state = 0;
  118. }
  119. else {
  120. gtk_widget_show (glade_xml_get_widget(xml, "vbox13"));
  121. gtk_widget_hide (glade_xml_get_widget(xml, "show_console1"));
  122. gtk_widget_show (glade_xml_get_widget(xml, "hide_console1"));
  123. state = 1;
  124. }
  125. }
  126. //Graph
  127. void mNodeListSlot(GtkWidget *widget, void *user_data) {
  128. (void)widget;
  129. (void)user_data;
  130. gtk_widget_show(glade_xml_get_widget(xml, "frmTVNodes"));
  131. setup_tree (view->g[view->activeGraph]);
  132. }
  133. void mNewNodeSlot(GtkWidget *widget, void *user_data) {
  134. (void)widget;
  135. (void)user_data;
  136. }
  137. void mNewEdgeSlot(GtkWidget *widget, void *user_data) {
  138. (void)widget;
  139. (void)user_data;
  140. }
  141. void mNewClusterSlot(GtkWidget *widget, void *user_data) {
  142. (void)widget;
  143. (void)user_data;
  144. }
  145. void mGraphPropertiesSlot(GtkWidget *widget, void *user_data) {
  146. (void)widget;
  147. (void)user_data;
  148. //there has to be an active graph to open the graph prop page
  149. if (view->activeGraph > -1) {
  150. load_graph_properties(); //load from graph to gui
  151. gtk_dialog_set_response_sensitive((GtkDialog *)
  152. glade_xml_get_widget(xml,
  153. "dlgOpenGraph"),
  154. 1, 1);
  155. gtk_dialog_set_response_sensitive((GtkDialog *)
  156. glade_xml_get_widget(xml,
  157. "dlgOpenGraph"),
  158. 2, 1);
  159. gtk_dialog_run((GtkDialog *)glade_xml_get_widget(xml, "dlgOpenGraph"));
  160. //need to hide the dialog , again freaking GTK!!!!
  161. gtk_widget_hide(glade_xml_get_widget(xml, "dlgOpenGraph"));
  162. }
  163. }
  164. void mNodeFindSlot(GtkWidget *widget, void *user_data) {
  165. (void)widget;
  166. (void)user_data;
  167. }
  168. static void mPropertiesSlot(void) {
  169. if (view->activeGraph >= 0)
  170. gtk_widget_hide(glade_xml_get_widget(xml, "frmObject"));
  171. gtk_widget_show(glade_xml_get_widget(xml, "frmObject"));
  172. }
  173. void mClusterPropertiesSlot(GtkWidget *widget, void *user_data) {
  174. (void)widget;
  175. (void)user_data;
  176. mPropertiesSlot();
  177. }
  178. void mNodePropertiesSlot(GtkWidget *widget, void *user_data) {
  179. (void)widget;
  180. (void)user_data;
  181. mPropertiesSlot();
  182. }
  183. void mEdgePropertiesSlot(GtkWidget *widget, void *user_data) {
  184. (void)widget;
  185. (void)user_data;
  186. mPropertiesSlot();
  187. }
  188. void mShowCodeSlot(GtkWidget *widget, void *user_data) {
  189. (void)widget;
  190. (void)user_data;
  191. }
  192. void mAbout(GtkWidget *widget, void *user_data) {
  193. (void)widget;
  194. (void)user_data;
  195. }
  196. void change_cursor(GdkCursorType C)
  197. {
  198. GdkCursor *cursor;
  199. cursor = gdk_cursor_new(C);
  200. gdk_window_set_cursor((GdkWindow *) view->drawing_area->window,
  201. cursor);
  202. gdk_cursor_destroy(cursor);
  203. }
  204. void mTestgvpr(GtkWidget *widget, void *user_data) {
  205. (void)widget;
  206. (void)user_data;
  207. char *bf2;
  208. GtkTextBuffer *gtkbuf;
  209. GtkTextIter startit;
  210. GtkTextIter endit;
  211. const char *args;
  212. int cloneGraph;
  213. args =
  214. gtk_entry_get_text((GtkEntry *)
  215. glade_xml_get_widget(xml, "gvprargs"));
  216. gtkbuf =
  217. gtk_text_view_get_buffer((GtkTextView *)
  218. glade_xml_get_widget(xml,
  219. "gvprtextinput"));
  220. gtk_text_buffer_get_start_iter(gtkbuf, &startit);
  221. gtk_text_buffer_get_end_iter(gtkbuf, &endit);
  222. bf2 = gtk_text_buffer_get_text(gtkbuf, &startit, &endit, 0);
  223. if (*args == '\0' && *bf2 == '\0') {
  224. g_free(bf2);
  225. return;
  226. }
  227. size_t argc = 1;
  228. if (*args != '\0')
  229. argc += 2;
  230. if (*bf2 != '\0')
  231. argc++;
  232. if (gtk_toggle_button_get_active
  233. ((GtkToggleButton *) glade_xml_get_widget(xml, "gvprapplycb"))) {
  234. cloneGraph = 1;
  235. argc++;
  236. } else
  237. cloneGraph = 0;
  238. assert(argc <= 5);
  239. char *argv[6] = {0};
  240. size_t j = 0;
  241. argv[j++] = "smyrna";
  242. if (cloneGraph)
  243. argv[j++] = "-C";
  244. if (*args != '\0') {
  245. argv[j++] = "-a";
  246. // Suppress Clang/GCC -Wcast-qual warning. Casting away const here is acceptable
  247. // as `run_gvpr` does not modify input arguments.
  248. #ifdef __GNUC__
  249. #pragma GCC diagnostic push
  250. #pragma GCC diagnostic ignored "-Wcast-qual"
  251. #endif
  252. argv[j++] = (char*)args;
  253. #ifdef __GNUC__
  254. #pragma GCC diagnostic pop
  255. #endif
  256. }
  257. if (*bf2 != '\0') {
  258. argv[j++] = bf2;
  259. }
  260. assert(j == argc);
  261. run_gvpr(view->g[view->activeGraph], argc, argv);
  262. g_free(bf2);
  263. }
  264. /*
  265. opens a file open dialog and load a gvpr program to gvpr script text box
  266. if the current script is modified, user should be informed about it
  267. */
  268. void on_gvprbuttonload_clicked(GtkWidget *widget, void *user_data) {
  269. (void)widget;
  270. (void)user_data;
  271. FILE *input_file = NULL;
  272. char *str;
  273. agxbuf xbuf = {0};
  274. GtkTextBuffer *gtkbuf; /*GTK buffer from glade GUI */
  275. char buf[BUFSIZ];
  276. char *filename = NULL;
  277. if (openfiledlg(&filename)) {
  278. input_file = fopen(filename, "r");
  279. g_free(filename);
  280. if (input_file) {
  281. while (fgets(buf, BUFSIZ, input_file))
  282. agxbput(&xbuf, buf);
  283. gtkbuf =
  284. gtk_text_view_get_buffer((GtkTextView *)
  285. glade_xml_get_widget(xml,
  286. "gvprtextinput"));
  287. str = agxbuse(&xbuf);
  288. if (g_utf8_validate(str, -1, NULL)) {
  289. gtk_text_buffer_set_text(gtkbuf, str, -1);
  290. } else {
  291. show_gui_warning("File format is not UTF8!");
  292. }
  293. fclose(input_file);
  294. } else {
  295. show_gui_warning("file couldn't be opened\n");
  296. }
  297. }
  298. agxbfree(&xbuf);
  299. }
  300. /*
  301. opens a file save dialog and save a gvpr program from gvpr script text box
  302. if the current script is modified, user should be informed about it
  303. */
  304. void on_gvprbuttonsave_clicked(GtkWidget *widget, void *user_data) {
  305. (void)widget;
  306. (void)user_data;
  307. FILE *output_file = NULL;
  308. GtkTextBuffer *gtkbuf; /*GTK buffer from glade GUI */
  309. char *bf2;
  310. GtkTextIter startit;
  311. GtkTextIter endit;
  312. char *filename = NULL;
  313. if (savefiledlg(&filename)) {
  314. output_file = fopen(filename, "w");
  315. g_free(filename);
  316. if (output_file) {
  317. gtkbuf =
  318. gtk_text_view_get_buffer((GtkTextView *)
  319. glade_xml_get_widget(xml,
  320. "gvprtextinput"));
  321. gtk_text_buffer_get_start_iter(gtkbuf, &startit);
  322. gtk_text_buffer_get_end_iter(gtkbuf, &endit);
  323. bf2 = gtk_text_buffer_get_text(gtkbuf, &startit, &endit, 0);
  324. fputs(bf2, output_file);
  325. free(bf2);
  326. fclose(output_file);
  327. }
  328. /*Code has not been completed for this function yet */
  329. }
  330. }