Code

Separated the OCAL import and export dialogs into their own source file - ocaldialogs...
[inkscape.git] / src / ui / dialog / ocaldialogs.cpp
1 /**\r
2  * Implementation of the OCAL import/export dialogs\r
3  *\r
4  * Authors:\r
5  *   Joel Holdsworth\r
6  *   Bruno Dilly\r
7  *   Other dudes from The Inkscape Organization\r
8  *\r
9  * Copyright (C) 2007 Bruno Dilly\r
10  *\r
11  * Released under GNU GPL, read the file 'COPYING' for more information\r
12  */\r
13 \r
14 #ifdef HAVE_CONFIG_H\r
15 # include <config.h>\r
16 #endif\r
17 \r
18 #include "ocaldialogs.h"\r
19 #include "dialogs/dialog-events.h"\r
20 #include "interface.h"\r
21 \r
22 #ifdef WITH_GNOME_VFS\r
23 # include <libgnomevfs/gnome-vfs.h>\r
24 #endif\r
25 \r
26 namespace Inkscape\r
27 {\r
28 namespace UI\r
29 {\r
30 namespace Dialog\r
31 {
33 //########################################################################\r
34 //# F I L E    E X P O R T   T O   O C A L\r
35 //########################################################################\r
36 \r
37 \r
38 \r
39 /**\r
40  * Callback for fileNameEntry widget\r
41  */\r
42 void FileExportToOCALDialog::fileNameEntryChangedCallback()\r
43 {\r
44     if (!fileNameEntry)\r
45         return;\r
46 \r
47     Glib::ustring fileName = fileNameEntry->get_text();\r
48     if (!Glib::get_charset()) //If we are not utf8\r
49         fileName = Glib::filename_to_utf8(fileName);\r
50 \r
51     myFilename = fileName;\r
52     response(Gtk::RESPONSE_OK);\r
53 }\r
54 \r
55 \r
56 \r
57 /**\r
58  * Callback for fileNameEntry widget\r
59  */\r
60 void FileExportToOCALDialog::fileTypeChangedCallback()\r
61 {\r
62     int sel = fileTypeComboBox.get_active_row_number();\r
63     if (sel<0 || sel >= (int)fileTypes.size())\r
64         return;\r
65     FileType type = fileTypes[sel];\r
66 \r
67     extension = type.extension;\r
68     updateNameAndExtension();\r
69 }\r
70 \r
71 \r
72 \r
73 void FileExportToOCALDialog::createFileTypeMenu()\r
74 {\r
75     Inkscape::Extension::DB::OutputList extension_list;\r
76     Inkscape::Extension::db.get_output_list(extension_list);\r
77     knownExtensions.clear();\r
78 \r
79     for (Inkscape::Extension::DB::OutputList::iterator current_item = extension_list.begin();\r
80          current_item != extension_list.end(); current_item++)\r
81     {\r
82         Inkscape::Extension::Output * omod = *current_item;\r
83 \r
84         // FIXME: would be nice to grey them out instead of not listing them\r
85         if (omod->deactivated()) continue;\r
86 \r
87         FileType type;\r
88         type.name     = (_(omod->get_filetypename()));\r
89         type.pattern  = "*";\r
90         Glib::ustring extension = omod->get_extension();\r
91         knownExtensions.insert( extension.casefold() );\r
92         fileDialogExtensionToPattern (type.pattern, extension);\r
93         type.extension= omod;\r
94         fileTypeComboBox.append_text(type.name);\r
95         fileTypes.push_back(type);\r
96     }\r
97 \r
98     //#Let user choose\r
99     FileType guessType;\r
100     guessType.name = _("Guess from extension");\r
101     guessType.pattern = "*";\r
102     guessType.extension = NULL;\r
103     fileTypeComboBox.append_text(guessType.name);\r
104     fileTypes.push_back(guessType);\r
105 \r
106 \r
107     fileTypeComboBox.set_active(0);\r
108     fileTypeChangedCallback(); //call at least once to set the filter\r
109 }\r
110 \r
111 \r
112 \r
113 /**\r
114  * Constructor\r
115  */\r
116 FileExportToOCALDialog::FileExportToOCALDialog(Gtk::Window &parentWindow,\r
117             const Glib::ustring &title,\r
118             const Glib::ustring &default_key) :\r
119     FileDialogOCALBase(title)\r
120 {\r
121     /*\r
122      * Start Taking the vertical Box and putting a Label\r
123      * and a Entry to take the filename\r
124      * Later put the extension selection and checkbox (?)\r
125      */\r
126     /* Initalize to Autodetect */\r
127     extension = NULL;\r
128     /* No filename to start out with */\r
129     myFilename = "";\r
130 \r
131     Gtk::VBox *vbox = get_vbox();\r
132 \r
133     Gtk::Label *fileLabel = new Gtk::Label(_("File"));\r
134 \r
135     fileNameEntry = new Gtk::Entry();\r
136     fileNameEntry->set_text(myFilename);\r
137     fileNameEntry->set_max_length(252); // I am giving the extension approach.\r
138     fileBox.pack_start(*fileLabel);\r
139     fileBox.pack_start(*fileNameEntry, Gtk::PACK_EXPAND_WIDGET, 3);\r
140     vbox->pack_start(fileBox);\r
141 \r
142     //###### Do we want the .xxx extension automatically added?\r
143     fileTypeCheckbox.set_label(Glib::ustring(_("Append filename extension automatically")));\r
144     fileTypeCheckbox.set_active( (bool)prefs_get_int_attribute("dialogs.export",\r
145                                                                "append_extension", 1) );\r
146 \r
147     createFileTypeMenu();\r
148 \r
149     fileTypeComboBox.set_size_request(200,40);\r
150     fileTypeComboBox.signal_changed().connect(\r
151         sigc::mem_fun(*this, &FileExportToOCALDialog::fileTypeChangedCallback) );\r
152 \r
153     checksBox.pack_start( fileTypeCheckbox );\r
154     vbox->pack_start( checksBox );\r
155 \r
156     vbox->pack_end( fileTypeComboBox );\r
157 \r
158     //Let's do some customization\r
159     fileNameEntry = NULL;\r
160     Gtk::Container *cont = get_toplevel();\r
161     std::vector<Gtk::Entry *> entries;\r
162     findEntryWidgets(cont, entries);\r
163     //g_message("Found %d entry widgets\n", entries.size());\r
164     if (entries.size() >=1 )\r
165         {\r
166         //Catch when user hits [return] on the text field\r
167         fileNameEntry = entries[0];\r
168         fileNameEntry->signal_activate().connect(\r
169              sigc::mem_fun(*this, &FileExportToOCALDialog::fileNameEntryChangedCallback) );\r
170         }\r
171 \r
172     //Let's do more customization\r
173     std::vector<Gtk::Expander *> expanders;\r
174     findExpanderWidgets(cont, expanders);\r
175     //g_message("Found %d expander widgets\n", expanders.size());\r
176     if (expanders.size() >=1 )\r
177         {\r
178         //Always show the file list\r
179         Gtk::Expander *expander = expanders[0];\r
180         expander->set_expanded(true);\r
181         }\r
182 \r
183 \r
184     add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);\r
185     set_default(*add_button(Gtk::Stock::SAVE,   Gtk::RESPONSE_OK));\r
186 \r
187     show_all_children();\r
188 }\r
189 \r
190 \r
191 \r
192 /**\r
193  * Destructor\r
194  */\r
195 FileExportToOCALDialog::~FileExportToOCALDialog()\r
196 {\r
197 }\r
198 \r
199 \r
200 \r
201 /**\r
202  * Show this dialog modally.  Return true if user hits [OK]\r
203  */\r
204 bool\r
205 FileExportToOCALDialog::show()\r
206 {\r
207     set_modal (TRUE);                      //Window\r
208     sp_transientize((GtkWidget *)gobj());  //Make transient\r
209     gint b = run();                        //Dialog\r
210     hide();\r
211 \r
212     if (b == Gtk::RESPONSE_OK)\r
213     {\r
214         updateNameAndExtension();\r
215 \r
216         return TRUE;\r
217         }\r
218     else\r
219         {\r
220         return FALSE;\r
221         }\r
222 }\r
223 \r
224 \r
225 /**\r
226  * Get the file extension type that was selected by the user. Valid after an [OK]\r
227  */\r
228 Inkscape::Extension::Extension *\r
229 FileExportToOCALDialog::getSelectionType()\r
230 {\r
231     return extension;\r
232 }\r
233 \r
234 void FileExportToOCALDialog::setSelectionType( Inkscape::Extension::Extension * key )\r
235 {\r
236     // If no pointer to extension is passed in, look up based on filename extension.\r
237     if ( !key ) {\r
238         // Not quite UTF-8 here.\r
239         gchar *filenameLower = g_ascii_strdown(myFilename.c_str(), -1);\r
240         for ( int i = 0; !key && (i < (int)fileTypes.size()); i++ ) {\r
241             Inkscape::Extension::Output *ext = dynamic_cast<Inkscape::Extension::Output*>(fileTypes[i].extension);\r
242             if ( ext && ext->get_extension() ) {\r
243                 gchar *extensionLower = g_ascii_strdown( ext->get_extension(), -1 );\r
244                 if ( g_str_has_suffix(filenameLower, extensionLower) ) {\r
245                     key = fileTypes[i].extension;\r
246                 }\r
247                 g_free(extensionLower);\r
248             }\r
249         }\r
250         g_free(filenameLower);\r
251     }\r
252 \r
253     // Ensure the proper entry in the combo box is selected.\r
254     if ( key ) {\r
255         extension = key;\r
256         gchar const * extensionID = extension->get_id();\r
257         if ( extensionID ) {\r
258             for ( int i = 0; i < (int)fileTypes.size(); i++ ) {\r
259                 Inkscape::Extension::Extension *ext = fileTypes[i].extension;\r
260                 if ( ext ) {\r
261                     gchar const * id = ext->get_id();\r
262                     if ( id && ( strcmp(extensionID, id) == 0) ) {\r
263                         int oldSel = fileTypeComboBox.get_active_row_number();\r
264                         if ( i != oldSel ) {\r
265                             fileTypeComboBox.set_active(i);\r
266                         }\r
267                         break;\r
268                     }\r
269                 }\r
270             }\r
271         }\r
272     }\r
273 }\r
274 \r
275 \r
276 /**\r
277  * Get the file name chosen by the user.   Valid after an [OK]\r
278  */\r
279 Glib::ustring\r
280 FileExportToOCALDialog::getFilename()\r
281 {\r
282     myFilename = fileNameEntry->get_text();\r
283     updateNameAndExtension();\r
284     return myFilename;\r
285 }\r
286 \r
287 \r
288 void\r
289 FileExportToOCALDialog::change_title(const Glib::ustring& title)\r
290 {\r
291     this->set_title(title);\r
292 }\r
293 \r
294 void FileExportToOCALDialog::updateNameAndExtension()\r
295 {\r
296     // Pick up any changes the user has typed in.\r
297     Glib::ustring tmp = myFilename;   // get_filename();\r
298 \r
299     Inkscape::Extension::Output* newOut = extension ? dynamic_cast<Inkscape::Extension::Output*>(extension) : 0;\r
300     if ( fileTypeCheckbox.get_active() && newOut ) {\r
301         try {\r
302             bool appendExtension = true;\r
303             Glib::ustring utf8Name = Glib::filename_to_utf8( myFilename );\r
304             Glib::ustring::size_type pos = utf8Name.rfind('.');\r
305             if ( pos != Glib::ustring::npos ) {\r
306                 Glib::ustring trail = utf8Name.substr( pos );\r
307                 Glib::ustring foldedTrail = trail.casefold();\r
308                 if ( (trail == ".")\r
309                      | (foldedTrail != Glib::ustring( newOut->get_extension() ).casefold()\r
310                         && ( knownExtensions.find(foldedTrail) != knownExtensions.end() ) ) ) {\r
311                     utf8Name = utf8Name.erase( pos );\r
312                 } else {\r
313                     appendExtension = false;\r
314                 }\r
315             }\r
316 \r
317             if (appendExtension) {\r
318                 utf8Name = utf8Name + newOut->get_extension();\r
319                 myFilename = Glib::filename_from_utf8( utf8Name );\r
320 \r
321             }\r
322         } catch ( Glib::ConvertError& e ) {\r
323             // ignore\r
324         }\r
325     }\r
326 }\r
327 \r
328 //#########################################################################\r
329 //### F I L E   I M P O R T   F R O M   O C A L\r
330 //#########################################################################\r
331 \r
332 /*\r
333  * Callback for row activated\r
334  */\r
335 void FileListViewText::on_row_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column)\r
336 {\r
337     // create file path\r
338     myFilename = Glib::get_tmp_dir();\r
339     myFilename.append(G_DIR_SEPARATOR_S);\r
340     std::vector<int> posArray(1);\r
341     posArray = path.get_indices();\r
342     myFilename.append(get_text(posArray[0], 2));\r
343     \r
344 #ifdef WITH_GNOME_VFS\r
345     gnome_vfs_init();\r
346     GnomeVFSHandle    *from_handle = NULL;\r
347     GnomeVFSHandle    *to_handle = NULL;\r
348     GnomeVFSFileSize  bytes_read;\r
349     GnomeVFSFileSize  bytes_written;\r
350     GnomeVFSResult    result;\r
351     guint8 buffer[8192];\r
352 \r
353     //get file url\r
354     Glib::ustring fileUrl = get_text(posArray[0], 1); //http url\r
355 \r
356     //Glib::ustring fileUrl = "dav://"; //dav url\r
357     //fileUrl.append(prefs_get_string_attribute("options.ocalurl", "str"));\r
358     //fileUrl.append("/dav/");\r
359     //fileUrl.append(get_text(posArray[0], 3)); //author dir\r
360     //fileUrl.append("/");\r
361     //fileUrl.append(get_text(posArray[0], 2)); //filename\r
362 \r
363     if (!Glib::get_charset()) //If we are not utf8\r
364         fileUrl = Glib::filename_to_utf8(fileUrl);\r
365 \r
366     // verifies if the file wasn't previously downloaded\r
367     if(gnome_vfs_open(&to_handle, myFilename.c_str(), GNOME_VFS_OPEN_READ) == GNOME_VFS_ERROR_NOT_FOUND)\r
368     {\r
369         // open the temp file to receive\r
370         result = gnome_vfs_open (&to_handle, myFilename.c_str(), GNOME_VFS_OPEN_WRITE);\r
371         if (result == GNOME_VFS_ERROR_NOT_FOUND){\r
372             result = gnome_vfs_create (&to_handle, myFilename.c_str(), GNOME_VFS_OPEN_WRITE, FALSE, GNOME_VFS_PERM_USER_ALL);\r
373         }\r
374         if (result != GNOME_VFS_OK) {\r
375             g_warning("Error creating temp file: %s", gnome_vfs_result_to_string(result));\r
376             return;\r
377         }\r
378         result = gnome_vfs_open (&from_handle, fileUrl.c_str(), GNOME_VFS_OPEN_READ);\r
379         if (result != GNOME_VFS_OK) {\r
380             g_warning("Could not find the file in Open Clip Art Library.");\r
381             return;\r
382         }\r
383         // copy the file\r
384         while (1) {\r
385             result = gnome_vfs_read (from_handle, buffer, 8192, &bytes_read);\r
386             if ((result == GNOME_VFS_ERROR_EOF) &&(!bytes_read)){\r
387                 result = gnome_vfs_close (from_handle);\r
388                 result = gnome_vfs_close (to_handle);\r
389                 break;\r
390             }\r
391             if (result != GNOME_VFS_OK) {\r
392                 g_warning("%s", gnome_vfs_result_to_string(result));\r
393                 return;\r
394             }\r
395             result = gnome_vfs_write (to_handle, buffer, bytes_read, &bytes_written);\r
396             if (result != GNOME_VFS_OK) {\r
397                 g_warning("%s", gnome_vfs_result_to_string(result));\r
398                 return;\r
399             }\r
400             if (bytes_read != bytes_written){\r
401                 g_warning("Bytes read not equal to bytes written");\r
402                 return;\r
403             }\r
404         }\r
405     }\r
406     else\r
407     {\r
408         gnome_vfs_close(to_handle);\r
409     }\r
410     myPreview->showImage(myFilename);\r
411 #endif\r
412 }\r
413 \r
414 \r
415 /*\r
416  * Returns the selected filename\r
417  */\r
418 Glib::ustring FileListViewText::getFilename()\r
419 {\r
420     return myFilename;\r
421 }\r
422 \r
423 /**\r
424  * Callback for user input into searchTagEntry\r
425  */\r
426 void FileImportFromOCALDialog::searchTagEntryChangedCallback()\r
427 {\r
428     if (!searchTagEntry)\r
429         return;\r
430 \r
431     notFoundLabel->hide();\r
432 \r
433     Glib::ustring searchTag = searchTagEntry->get_text();\r
434     // create the ocal uri to get rss feed\r
435     Glib::ustring uri = "http://www.";\r
436     uri.append(prefs_get_string_attribute("options.ocalurl", "str"));\r
437     uri.append("/media/feed/rss/");\r
438     uri.append(searchTag);\r
439     if (!Glib::get_charset()) //If we are not utf8\r
440         uri = Glib::filename_to_utf8(uri);\r
441 \r
442 #ifdef WITH_GNOME_VFS\r
443 \r
444     // get the rss feed\r
445     gnome_vfs_init();\r
446     GnomeVFSHandle    *from_handle = NULL;\r
447     GnomeVFSHandle    *to_handle = NULL;\r
448     GnomeVFSFileSize  bytes_read;\r
449     GnomeVFSFileSize  bytes_written;\r
450     GnomeVFSResult    result;\r
451     guint8 buffer[8192];\r
452 \r
453     // create the temp file name\r
454     Glib::ustring fileName = Glib::get_tmp_dir ();\r
455     fileName.append(G_DIR_SEPARATOR_S);\r
456     fileName.append("ocalfeed.xml");\r
457 \r
458     // open the temp file to receive\r
459     result = gnome_vfs_open (&to_handle, fileName.c_str(), GNOME_VFS_OPEN_WRITE);\r
460     if (result == GNOME_VFS_ERROR_NOT_FOUND){\r
461         result = gnome_vfs_create (&to_handle, fileName.c_str(), GNOME_VFS_OPEN_WRITE, FALSE, GNOME_VFS_PERM_USER_ALL);\r
462     }\r
463     if (result != GNOME_VFS_OK) {\r
464         g_warning("Error creating temp file: %s", gnome_vfs_result_to_string(result));\r
465         return;\r
466     }\r
467 \r
468     // open the rss feed\r
469     result = gnome_vfs_open (&from_handle, uri.c_str(), GNOME_VFS_OPEN_READ);\r
470     if (result != GNOME_VFS_OK) {\r
471         sp_ui_error_dialog(_("Failed to receive the Open Clip Art Library RSS feed. Verify if the URL is correct in Configuration->Misc (e.g.: openclipart.org)"));\r
472         //g_warning("Could not find the Open Clip Art Library rss feed. Verify if the OCAL url is correct in Configuration");\r
473         return;\r
474     }\r
475 \r
476     // copy the file\r
477     while (1) {\r
478 \r
479         result = gnome_vfs_read (from_handle, buffer, 8192, &bytes_read);\r
480 \r
481         if ((result == GNOME_VFS_ERROR_EOF) &&(!bytes_read)){\r
482             result = gnome_vfs_close (from_handle);\r
483             result = gnome_vfs_close (to_handle);\r
484             break;\r
485         }\r
486 \r
487         if (result != GNOME_VFS_OK) {\r
488             g_warning("%s", gnome_vfs_result_to_string(result));\r
489             return;\r
490         }\r
491         result = gnome_vfs_write (to_handle, buffer, bytes_read, &bytes_written);\r
492         if (result != GNOME_VFS_OK) {\r
493             g_warning("%s", gnome_vfs_result_to_string(result));\r
494             return;\r
495         }\r
496 \r
497         if (bytes_read != bytes_written){\r
498             g_warning("Bytes read not equal to bytes written");\r
499             return;\r
500         }\r
501 \r
502     }\r
503 \r
504     // create the resulting xml document tree\r
505     // this initialize the library and test mistakes between compiled and shared library used\r
506     LIBXML_TEST_VERSION \r
507     xmlDoc *doc = NULL;\r
508     xmlNode *root_element = NULL;\r
509     doc = xmlReadFile(fileName.c_str(), NULL, 0);\r
510     if (doc == NULL) {\r
511         g_warning("Failed to parse %s\n", fileName.c_str());\r
512     return;\r
513     }\r
514     \r
515     // get the root element node\r
516     root_element = xmlDocGetRootElement(doc);\r
517 \r
518     // clear the fileslist\r
519     filesList->clear_items();\r
520     filesList->set_sensitive(false);\r
521 \r
522     // print all xml the element names\r
523     print_xml_element_names(root_element);\r
524 \r
525     if (filesList->size() == 0)\r
526     {\r
527         notFoundLabel->show();\r
528         filesList->set_sensitive(false);\r
529     }\r
530     else\r
531         filesList->set_sensitive(true);\r
532 \r
533     // free the document\r
534     xmlFreeDoc(doc);\r
535     // free the global variables that may have been allocated by the parser\r
536     xmlCleanupParser();\r
537     return;\r
538 #endif    \r
539 }\r
540 \r
541 /**\r
542  * Prints the names of the all the xml elements \r
543  * that are siblings or children of a given xml node\r
544  */\r
545 void FileImportFromOCALDialog::print_xml_element_names(xmlNode * a_node)\r
546 {\r
547     xmlNode *cur_node = NULL;\r
548     guint row_num = 0;\r
549     for (cur_node = a_node; cur_node; cur_node = cur_node->next) {\r
550         // get itens information\r
551         if (strcmp((const char*)cur_node->name, "rss")) //avoid the root\r
552             if (cur_node->type == XML_ELEMENT_NODE && !strcmp((const char*)cur_node->parent->name, "item"))\r
553             {\r
554                 if (!strcmp((const char*)cur_node->name, "title"))\r
555                 {\r
556                     xmlChar *title = xmlNodeGetContent(cur_node);\r
557                     row_num = filesList->append_text((const char*)title);\r
558                     xmlFree(title);\r
559                 }\r
560 #ifdef WITH_GNOME_VFS\r
561                 else if (!strcmp((const char*)cur_node->name, "enclosure"))\r
562                 {\r
563                     xmlChar *urlattribute = xmlGetProp(cur_node, (xmlChar*)"url");\r
564                     filesList->set_text(row_num, 1, (const char*)urlattribute);\r
565                     gchar *tmp_file;\r
566                     tmp_file = gnome_vfs_uri_extract_short_path_name(gnome_vfs_uri_new((const char*)urlattribute));\r
567                     filesList->set_text(row_num, 2, (const char*)tmp_file);\r
568                     xmlFree(urlattribute);\r
569                 }\r
570                 else if (!strcmp((const char*)cur_node->name, "creator"))\r
571                 {\r
572                     filesList->set_text(row_num, 3, (const char*)xmlNodeGetContent(cur_node));\r
573                 }\r
574 #endif\r
575             }\r
576         print_xml_element_names(cur_node->children);\r
577     }\r
578 }\r
579 \r
580 /**\r
581  * Constructor.  Not called directly.  Use the factory.\r
582  */\r
583 FileImportFromOCALDialog::FileImportFromOCALDialog(Gtk::Window& parentWindow, \r
584                                        const Glib::ustring &dir,\r
585                                        const Glib::ustring &title) :\r
586      FileDialogOCALBase(title)\r
587 {\r
588 \r
589     // Initalize to Autodetect\r
590     extension = NULL;\r
591     // No filename to start out with\r
592     Glib::ustring searchTag = "";\r
593 \r
594     Gtk::VBox *vbox = get_vbox();\r
595     Gtk::Label *tagLabel = new Gtk::Label(_("Search Tag"));\r
596     notFoundLabel = new Gtk::Label(_("No files matched your search"));\r
597     messageBox.pack_start(*notFoundLabel);\r
598     searchTagEntry = new Gtk::Entry();\r
599     searchTagEntry->set_text(searchTag);\r
600     searchTagEntry->set_max_length(252); // I am giving the extension approach.\r
601     tagBox.pack_start(*tagLabel);\r
602     tagBox.pack_start(*searchTagEntry, Gtk::PACK_EXPAND_WIDGET, 3);\r
603     filesPreview = new SVGPreview();\r
604     filesPreview->showNoPreview();\r
605     filesList = new FileListViewText(4, *filesPreview);\r
606     filesList->set_sensitive(false);\r
607     // add the listview inside a ScrolledWindow\r
608     listScrolledWindow.add(*filesList);\r
609     // only show the scrollbars when they are necessary:\r
610     listScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\r
611     filesList->set_column_title(0, _("Files Found"));\r
612     listScrolledWindow.set_size_request(200, 180);\r
613     filesList->get_column(1)->set_visible(false); // file url\r
614     filesList->get_column(2)->set_visible(false); // tmp file path\r
615     filesList->get_column(3)->set_visible(false); // author dir\r
616     filesBox.pack_start(listScrolledWindow);\r
617     filesBox.pack_start(*filesPreview);\r
618     vbox->pack_start(tagBox);\r
619     vbox->pack_start(messageBox);\r
620     vbox->pack_start(filesBox);\r
621 \r
622     //Let's do some customization\r
623     searchTagEntry = NULL;\r
624     Gtk::Container *cont = get_toplevel();\r
625     std::vector<Gtk::Entry *> entries;\r
626     findEntryWidgets(cont, entries);\r
627     if (entries.size() >=1 )\r
628     {\r
629     //Catch when user hits [return] on the text field\r
630         searchTagEntry = entries[0];\r
631         searchTagEntry->signal_activate().connect(\r
632               sigc::mem_fun(*this, &FileImportFromOCALDialog::searchTagEntryChangedCallback));\r
633     }\r
634 \r
635     add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);\r
636     set_default(*add_button(Gtk::Stock::OPEN,   Gtk::RESPONSE_OK));\r
637 \r
638     show_all_children();\r
639     notFoundLabel->hide();\r
640 }\r
641 \r
642 /**\r
643  * Destructor\r
644  */\r
645 FileImportFromOCALDialog::~FileImportFromOCALDialog()\r
646 {\r
647 \r
648 }\r
649 \r
650 /**\r
651  * Show this dialog modally.  Return true if user hits [OK]\r
652  */\r
653 bool\r
654 FileImportFromOCALDialog::show()\r
655 {\r
656     set_modal (TRUE);                      //Window\r
657     sp_transientize((GtkWidget *)gobj());  //Make transient\r
658     gint b = run();                        //Dialog\r
659     hide();\r
660 \r
661     if (b == Gtk::RESPONSE_OK)\r
662     {\r
663         return TRUE;\r
664     }\r
665     else\r
666     {\r
667         return FALSE;\r
668     }\r
669 }\r
670 \r
671 \r
672 /**\r
673  * Get the file extension type that was selected by the user. Valid after an [OK]\r
674  */\r
675 Inkscape::Extension::Extension *\r
676 FileImportFromOCALDialog::getSelectionType()\r
677 {\r
678     return extension;\r
679 }\r
680 \r
681 \r
682 /**\r
683  * Get the file name chosen by the user.   Valid after an [OK]\r
684  */\r
685 Glib::ustring\r
686 FileImportFromOCALDialog::getFilename (void)\r
687 {\r
688     return filesList->getFilename();\r
689 }\r
690 \r
691 } //namespace Dialog\r
692 } //namespace UI\r
693 } //namespace Inkscape\r
694 \r
695 /*\r
696   Local Variables:\r
697   mode:c++\r
698   c-file-style:"stroustrup"\r
699   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
700   indent-tabs-mode:nil\r
701   fill-column:99\r
702   End:\r
703 */\r
704 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :