1 /*
2  * file.c
3  *
4  *
5  * Authors:
6  *  Richard Hult <rhult@hem.passagen.se>
7  *  Ricardo Markiewicz <rmarkie@fi.uba.ar>
8  *  Andres de Barbara <adebarbara@fi.uba.ar>
9  *  Marc Lorber <lorber.marc@wanadoo.fr>
10  *
11  * Web page: https://ahoi.io/project/oregano
12  *
13  * Copyright (C) 1999-2001  Richard Hult
14  * Copyright (C) 2003,2006  Ricardo Markiewicz
15  * Copyright (C) 2009-2012  Marc Lorber
16  *
17  * This program is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU General Public License as
19  * published by the Free Software Foundation; either version 2 of the
20  * License, or (at your option) any later version.
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public
28  * License along with this program; if not, write to the
29  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
30  * Boston, MA 02110-1301, USA.
31  */
32 
33 #include <string.h>
34 #include <glib/gi18n.h>
35 
36 #include "file.h"
37 #include "schematic.h"
38 #include "schematic-view.h"
39 #include "dialogs.h"
40 #include "save-schematic.h"
41 
dialog_open_file(SchematicView * sv)42 char *dialog_open_file (SchematicView *sv)
43 {
44 	GtkWidget *dialog;
45 	GtkFileFilter *allfilter, *orefilter;
46 	char *name;
47 
48 	allfilter = gtk_file_filter_new ();
49 	orefilter = gtk_file_filter_new ();
50 
51 	gtk_file_filter_set_name (orefilter, _ ("Oregano Files"));
52 	gtk_file_filter_add_pattern (orefilter, "*.oregano");
53 	gtk_file_filter_set_name (allfilter, _ ("All Files"));
54 	gtk_file_filter_add_pattern (allfilter, "*");
55 
56 	dialog = gtk_file_chooser_dialog_new (_ ("Open File"),
57 	                                      NULL,
58 	                                      GTK_FILE_CHOOSER_ACTION_OPEN,
59 	                                      _("_Cancel"),
60 	                                      GTK_RESPONSE_CANCEL,
61 	                                      _("_Open"),
62 	                                      GTK_RESPONSE_ACCEPT,
63 	                                      NULL);
64 
65 	gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), orefilter);
66 	gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), allfilter);
67 
68 	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
69 		name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
70 		if (name[strlen (name) - 1] == '/') {
71 			g_free (name);
72 			name = NULL;
73 		}
74 	} else
75 		name = NULL;
76 
77 	gtk_widget_destroy (dialog);
78 	return name;
79 }
80 
dialog_save_as(SchematicView * sv)81 void dialog_save_as (SchematicView *sv)
82 {
83 	GtkWidget *dialog;
84 	GtkFileFilter *orefilter, *allfilter;
85 	char *name;
86 	Schematic *sm;
87 	GError *error = NULL;
88 
89 	orefilter = gtk_file_filter_new ();
90 	allfilter = gtk_file_filter_new ();
91 	gtk_file_filter_set_name (orefilter, _ ("Oregano Files"));
92 	gtk_file_filter_add_pattern (orefilter, "*.oregano");
93 	gtk_file_filter_set_name (allfilter, _ ("All Files"));
94 	gtk_file_filter_add_pattern (allfilter, "*");
95 
96 	dialog = gtk_file_chooser_dialog_new (_ ("Save File"),
97 	                                      NULL,
98 	                                      GTK_FILE_CHOOSER_ACTION_SAVE,
99 	                                      _("_Cancel"),
100 	                                      GTK_RESPONSE_CANCEL,
101 	                                      _("_Save"),
102 	                                      GTK_RESPONSE_ACCEPT,
103 	                                      NULL);
104 
105 	gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), orefilter);
106 	gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), allfilter);
107 
108 	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
109 
110 		name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
111 		if (name[strlen (name) - 1] != '/') {
112 			gchar *tmp;
113 			const gchar *base = g_path_get_basename (name);
114 
115 			if (strchr (base, '.') == NULL) {
116 				tmp = g_strconcat (name, ".oregano", NULL);
117 			} else {
118 				tmp = g_strdup (name);
119 			}
120 
121 			sm = schematic_view_get_schematic (sv);
122 
123 			schematic_set_filename (sm, tmp);
124 
125 			if (!schematic_save_file (sm, &error)) {
126 				char *msg = g_strdup_printf ("Could not save Schematic file %s\n", tmp);
127 				oregano_error (msg);
128 				g_free (msg);
129 				g_free (name);
130 			}
131 			g_free (tmp);
132 		}
133 	}
134 
135 	gtk_widget_destroy (dialog);
136 }
137 
dialog_netlist_file(SchematicView * sv)138 char *dialog_netlist_file (SchematicView *sv)
139 {
140 	GtkWidget *dialog;
141 	char *name = NULL;
142 
143 	dialog = gtk_file_chooser_dialog_new (_ ("Netlist File"),
144 	                                      NULL,
145 	                                      GTK_FILE_CHOOSER_ACTION_SAVE,
146 	                                      _("_Cancel"),
147 	                                      GTK_RESPONSE_CANCEL,
148 	                                      _("_Save"),
149 	                                      GTK_RESPONSE_ACCEPT,
150 	                                      NULL);
151 	gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), TRUE);
152 	gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
153 
154 	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
155 		name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
156 
157 		if (name[strlen (name) - 1] == '/') {
158 			name = NULL;
159 		} else {
160 			name = g_strdup (name);
161 		}
162 	} else
163 		name = NULL;
164 
165 	gtk_widget_destroy (dialog);
166 	return name;
167 }
168 
dialog_file_open(const gchar * title)169 char *dialog_file_open (const gchar *title)
170 {
171 	GtkWidget *dialog;
172 	char *name = NULL;
173 
174 	dialog = gtk_file_chooser_dialog_new (title,
175 	                                      NULL,
176 	                                      GTK_FILE_CHOOSER_ACTION_SAVE,
177 	                                      _("_Cancel"),
178 	                                      GTK_RESPONSE_CANCEL,
179 	                                      _("_Save"),
180 	                                      GTK_RESPONSE_ACCEPT,
181 	                                      NULL);
182 
183 	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
184 		name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
185 
186 		if (name[strlen (name) - 1] == '/') {
187 			g_free (name);
188 			name = NULL;
189 		} else
190 			name = g_strdup (name);
191 	} else
192 		name = NULL;
193 
194 	gtk_widget_destroy (dialog);
195 	return name;
196 }
197