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