Graphviz 12.0.1~dev.20240716.0800
Loading...
Searching...
No Matches
menucallbacks.c
Go to the documentation of this file.
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
11#include "menucallbacks.h"
12#include "viewport.h"
13#include "tvnodes.h"
14
15#include "gvprpipe.h"
16#include "topviewsettings.h"
17#include "gltemplate.h"
18#include <common/const.h>
19#include <cgraph/agxbuf.h>
20#include <assert.h>
21#include <ctype.h>
22#include <glib.h>
23#include <stdlib.h>
24#include "frmobjectui.h"
25
26void mAttributesSlot(GtkWidget * widget, gpointer user_data)
27{
28 (void)widget;
29 (void)user_data;
30
32}
33
34void mOpenSlot(GtkWidget * widget, gpointer user_data)
35{
36 (void)widget;
37 (void)user_data;
38
39 GtkWidget *dialog;
40 GtkFileFilter *filter;
41
42 filter = gtk_file_filter_new();
43 gtk_file_filter_add_pattern(filter, "*.gv");
44 gtk_file_filter_add_pattern(filter, "*.dot");
45 dialog = gtk_file_chooser_dialog_new("Open File",
46 NULL,
47 GTK_FILE_CHOOSER_ACTION_OPEN,
48 GTK_STOCK_CANCEL,
49 GTK_RESPONSE_CANCEL,
50 GTK_STOCK_OPEN,
51 GTK_RESPONSE_ACCEPT, NULL);
52
53 gtk_file_chooser_set_filter((GtkFileChooser *) dialog, filter);
54 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
55 char *filename;
56 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
57
59 g_free(filename);
60 }
61
62 gtk_widget_destroy(dialog);
63}
64
65void mSaveSlot(GtkWidget * widget, gpointer user_data)
66{
67 (void)widget;
68 (void)user_data;
69
70 save_graph(); //save without prompt
71}
72
73void mSaveAsSlot(GtkWidget * widget, gpointer user_data)
74{
75 (void)widget;
76 (void)user_data;
77
78 save_as_graph(); //save with prompt
79}
80
81void mCloseSlot(GtkWidget * widget, gpointer user_data)
82{
83 (void)widget;
84 (void)user_data;
85
86 if (view->activeGraph == 0)
88}
89
90void mOptionsSlot(GtkWidget * widget, gpointer user_data)
91{
92 (void)widget;
93 (void)user_data;
94}
95
96void mQuitSlot(GtkWidget * widget, gpointer user_data)
97{
98 (void)widget;
99 (void)user_data;
100
102 gtk_main_quit();
103}
104
105//edit
106void mCutSlot(GtkWidget * widget, gpointer user_data)
107{
108 (void)widget;
109 (void)user_data;
110}
111
112void mCopySlot(GtkWidget * widget, gpointer user_data)
113{
114 (void)widget;
115 (void)user_data;
116}
117
118void mPasteSlot(GtkWidget * widget, gpointer user_data)
119{
120 (void)widget;
121 (void)user_data;
122}
123
124void mDeleteSlot(GtkWidget * widget, gpointer user_data)
125{
126 (void)widget;
127 (void)user_data;
128}
129void mTopviewSettingsSlot(GtkWidget * widget, gpointer user_data)
130{
131 (void)widget;
132 (void)user_data;
134}
135
136//view
137void mShowToolBoxSlot(GtkWidget * widget, gpointer user_data)
138{
139 (void)widget;
140 (void)user_data;
141
142 if (!gtk_widget_set_gl_capability
143 (glade_xml_get_widget(xml, "glfixed"), configure_gl(),
144 gtk_widget_get_gl_context(view->drawing_area), 0, 0))
145 printf("glwidget creation failed \n");
146}
147
148void mShowConsoleSlot(GtkWidget * widget, gpointer user_data)
149{
150 (void)widget;
151 (void)user_data;
152
153 static int state = 0; // off by default
154
155 if (state) {
156 gtk_widget_hide (glade_xml_get_widget(xml, "vbox13"));
157 gtk_widget_show (glade_xml_get_widget(xml, "show_console1"));
158 gtk_widget_hide (glade_xml_get_widget(xml, "hide_console1"));
159 state = 0;
160 }
161 else {
162 gtk_widget_show (glade_xml_get_widget(xml, "vbox13"));
163 gtk_widget_hide (glade_xml_get_widget(xml, "show_console1"));
164 gtk_widget_show (glade_xml_get_widget(xml, "hide_console1"));
165 state = 1;
166 }
167}
168
169//Graph
170void mNodeListSlot(GtkWidget * widget, gpointer user_data)
171{
172 (void)widget;
173 (void)user_data;
174
175 gtk_widget_show(glade_xml_get_widget(xml, "frmTVNodes"));
177}
178
179void mNewNodeSlot(GtkWidget * widget, gpointer user_data)
180{
181 (void)widget;
182 (void)user_data;
183}
184
185void mNewEdgeSlot(GtkWidget * widget, gpointer user_data)
186{
187 (void)widget;
188 (void)user_data;
189}
190
191void mNewClusterSlot(GtkWidget * widget, gpointer user_data)
192{
193 (void)widget;
194 (void)user_data;
195}
196
197void mGraphPropertiesSlot(GtkWidget * widget, gpointer user_data)
198{
199 (void)widget;
200 (void)user_data;
201
202 //there has to be an active graph to open the graph prop page
203 if (view->activeGraph > -1) {
204 load_graph_properties(); //load from graph to gui
205 gtk_dialog_set_response_sensitive((GtkDialog *)
206 glade_xml_get_widget(xml,
207 "dlgOpenGraph"),
208 1, 1);
209 gtk_dialog_set_response_sensitive((GtkDialog *)
210 glade_xml_get_widget(xml,
211 "dlgOpenGraph"),
212 2, 1);
213 gtk_dialog_run((GtkDialog *)glade_xml_get_widget(xml, "dlgOpenGraph"));
214 //need to hide the dialog , again freaking GTK!!!!
215 gtk_widget_hide(glade_xml_get_widget(xml, "dlgOpenGraph"));
216 }
217}
218
219void mNodeFindSlot(GtkWidget * widget, gpointer user_data)
220{
221 (void)widget;
222 (void)user_data;
223}
224
225static void mPropertiesSlot(void) {
226 if (view->activeGraph >= 0)
227 gtk_widget_hide(glade_xml_get_widget(xml, "frmObject"));
228 gtk_widget_show(glade_xml_get_widget(xml, "frmObject"));
229}
230
231void mClusterPropertiesSlot(GtkWidget * widget, gpointer user_data)
232{
233 (void)widget;
234 (void)user_data;
235
237}
238
239void mNodePropertiesSlot(GtkWidget * widget, gpointer user_data)
240{
241 (void)widget;
242 (void)user_data;
243
245}
246
247void mEdgePropertiesSlot(GtkWidget * widget, gpointer user_data)
248{
249 (void)widget;
250 (void)user_data;
251
253}
254
255void mShowCodeSlot(GtkWidget * widget, gpointer user_data)
256{
257 (void)widget;
258 (void)user_data;
259}
260
261void mAbout(GtkWidget * widget, gpointer user_data)
262{
263 (void)widget;
264 (void)user_data;
265}
266
267void change_cursor(GdkCursorType C)
268{
269 GdkCursor *cursor;
270 cursor = gdk_cursor_new(C);
271 gdk_window_set_cursor((GdkWindow *) view->drawing_area->window,
272 cursor);
273 gdk_cursor_destroy(cursor);
274}
275
276void mTestgvpr(GtkWidget * widget, gpointer user_data)
277{
278 (void)widget;
279 (void)user_data;
280
281 char *bf2;
282 GtkTextBuffer *gtkbuf;
283 GtkTextIter startit;
284 GtkTextIter endit;
285 const char *args;
286 int cloneGraph;
287
288 args =
289 gtk_entry_get_text((GtkEntry *)
290 glade_xml_get_widget(xml, "gvprargs"));
291 gtkbuf =
292 gtk_text_view_get_buffer((GtkTextView *)
293 glade_xml_get_widget(xml,
294 "gvprtextinput"));
295 gtk_text_buffer_get_start_iter(gtkbuf, &startit);
296 gtk_text_buffer_get_end_iter(gtkbuf, &endit);
297 bf2 = gtk_text_buffer_get_text(gtkbuf, &startit, &endit, 0);
298
299 if (*args == '\0' && *bf2 == '\0') {
300 g_free(bf2);
301 return;
302 }
303
304 size_t argc = 1;
305 if (*args != '\0')
306 argc += 2;
307 if (*bf2 != '\0')
308 argc++;
309 if (gtk_toggle_button_get_active
310 ((GtkToggleButton *) glade_xml_get_widget(xml, "gvprapplycb"))) {
311 cloneGraph = 1;
312 argc++;
313 } else
314 cloneGraph = 0;
315 assert(argc <= 5);
316 char *argv[6] = {0};
317 size_t j = 0;
318 argv[j++] = "smyrna";
319 if (cloneGraph)
320 argv[j++] = "-C";
321 if (*args != '\0') {
322 argv[j++] = "-a";
323// Suppress Clang/GCC -Wcast-qual warning. Casting away const here is acceptable
324// as `run_gvpr` does not modify input arguments.
325#ifdef __GNUC__
326#pragma GCC diagnostic push
327#pragma GCC diagnostic ignored "-Wcast-qual"
328#endif
329 argv[j++] = (char*)args;
330#ifdef __GNUC__
331#pragma GCC diagnostic pop
332#endif
333 }
334 if (*bf2 != '\0') {
335 argv[j++] = bf2;
336 }
337 assert(j == argc);
338
339 run_gvpr(view->g[view->activeGraph], argc, argv);
340 g_free(bf2);
341}
342
343/*
344 opens a file open dialog and load a gvpr program to gvpr script text box
345 if the current script is modified, user should be informed about it
346*/
347void on_gvprbuttonload_clicked(GtkWidget * widget, gpointer user_data)
348{
349 (void)widget;
350 (void)user_data;
351
352 FILE *input_file = NULL;
353 char *str;
354 agxbuf xbuf = {0};
355 GtkTextBuffer *gtkbuf; /*GTK buffer from glade GUI */
356
357 char buf[BUFSIZ];
358
359 char *filename = NULL;
360 if (openfiledlg(&filename)) {
361 input_file = fopen(filename, "r");
362 g_free(filename);
363 if (input_file) {
364 while (fgets(buf, BUFSIZ, input_file))
365 agxbput(&xbuf, buf);
366 gtkbuf =
367 gtk_text_view_get_buffer((GtkTextView *)
368 glade_xml_get_widget(xml,
369 "gvprtextinput"));
370 str = agxbuse(&xbuf);
371 if (g_utf8_validate(str, -1, NULL)) {
372 gtk_text_buffer_set_text(gtkbuf, str, -1);
373 } else {
374 show_gui_warning("File format is not UTF8!");
375 }
376 fclose(input_file);
377 } else {
378 show_gui_warning("file couldn't be opened\n");
379 }
380 }
381 agxbfree(&xbuf);
382}
383
384/*
385 opens a file save dialog and save a gvpr program from gvpr script text box
386 if the current script is modified, user should be informed about it
387*/
388void on_gvprbuttonsave_clicked(GtkWidget * widget, gpointer user_data)
389{
390 (void)widget;
391 (void)user_data;
392
393 FILE *output_file = NULL;
394 GtkTextBuffer *gtkbuf; /*GTK buffer from glade GUI */
395 char *bf2;
396 GtkTextIter startit;
397 GtkTextIter endit;
398
399 char *filename = NULL;
400 if (savefiledlg(&filename)) {
401 output_file = fopen(filename, "w");
402 g_free(filename);
403 if (output_file) {
404 gtkbuf =
405 gtk_text_view_get_buffer((GtkTextView *)
406 glade_xml_get_widget(xml,
407 "gvprtextinput"));
408 gtk_text_buffer_get_start_iter(gtkbuf, &startit);
409 gtk_text_buffer_get_end_iter(gtkbuf, &endit);
410 bf2 = gtk_text_buffer_get_text(gtkbuf, &startit, &endit, 0);
411 fputs(bf2, output_file);
412 free(bf2);
413 fclose(output_file);
414 }
415
416 /*Code has not been completed for this function yet */
417 }
418}
static void agxbfree(agxbuf *xb)
free any malloced resources
Definition agxbuf.h:77
static size_t agxbput(agxbuf *xb, const char *s)
append string s into xb
Definition agxbuf.h:249
static char * agxbuse(agxbuf *xb)
Definition agxbuf.h:286
void showAttrsWidget(void)
GdkGLConfig * configure_gl(void)
Definition gltemplate.c:334
void free(void *)
node NULL
Definition grammar.y:149
int openfiledlg(char **filename)
Definition gui.c:57
int savefiledlg(char **filename)
Definition gui.c:81
void load_graph_properties(void)
Definition gui.c:33
void show_gui_warning(char *str)
Definition gui.c:40
GladeXML * xml
Definition gui.c:22
static Agraph_t * cloneGraph(std::vector< Agraph_t * > &gs, GVC_t *gvc)
Definition gvpack.cpp:553
int run_gvpr(Agraph_t *srcGraph, size_t argc, char *argv[])
Definition gvprpipe.c:41
static agxbuf xbuf[NUMXBUFS]
static lexstate_t state
Definition htmllex.c:61
agxbuf * str
Definition htmlparse.c:97
void mShowCodeSlot(GtkWidget *widget, gpointer user_data)
void mNodeListSlot(GtkWidget *widget, gpointer user_data)
void mNewClusterSlot(GtkWidget *widget, gpointer user_data)
void on_gvprbuttonload_clicked(GtkWidget *widget, gpointer user_data)
void mSaveSlot(GtkWidget *widget, gpointer user_data)
void change_cursor(GdkCursorType C)
void mShowConsoleSlot(GtkWidget *widget, gpointer user_data)
void mNewNodeSlot(GtkWidget *widget, gpointer user_data)
void mPasteSlot(GtkWidget *widget, gpointer user_data)
void mAbout(GtkWidget *widget, gpointer user_data)
void mOptionsSlot(GtkWidget *widget, gpointer user_data)
void mNewEdgeSlot(GtkWidget *widget, gpointer user_data)
void mSaveAsSlot(GtkWidget *widget, gpointer user_data)
void mNodeFindSlot(GtkWidget *widget, gpointer user_data)
void mNodePropertiesSlot(GtkWidget *widget, gpointer user_data)
void on_gvprbuttonsave_clicked(GtkWidget *widget, gpointer user_data)
void mCloseSlot(GtkWidget *widget, gpointer user_data)
void mCopySlot(GtkWidget *widget, gpointer user_data)
void mShowToolBoxSlot(GtkWidget *widget, gpointer user_data)
void mEdgePropertiesSlot(GtkWidget *widget, gpointer user_data)
void mDeleteSlot(GtkWidget *widget, gpointer user_data)
void mAttributesSlot(GtkWidget *widget, gpointer user_data)
void mQuitSlot(GtkWidget *widget, gpointer user_data)
void mGraphPropertiesSlot(GtkWidget *widget, gpointer user_data)
void mTopviewSettingsSlot(GtkWidget *widget, gpointer user_data)
void mClusterPropertiesSlot(GtkWidget *widget, gpointer user_data)
void mTestgvpr(GtkWidget *widget, gpointer user_data)
void mOpenSlot(GtkWidget *widget, gpointer user_data)
void mCutSlot(GtkWidget *widget, gpointer user_data)
static void mPropertiesSlot(void)
#define C
Definition pack.c:30
ViewInfo * view
Definition viewport.c:38
Agraph_t ** g
Definition smyrnadefs.h:313
int activeGraph
Definition smyrnadefs.h:317
GtkWidget * drawing_area
Definition smyrnadefs.h:331
void show_settings_form(void)
void setup_tree(Agraph_t *g)
Definition tvnodes.c:358
void close_graph(ViewInfo *vi)
Definition viewport.c:74
int add_graph_to_viewport_from_file(char *fileName)
Definition viewport.c:364
int save_as_graph(void)
Definition viewport.c:513
int save_graph(void)
Definition viewport.c:493