Code

add import from ocal feature
authorbdilly <bdilly@users.sourceforge.net>
Thu, 16 Aug 2007 12:19:21 +0000 (12:19 +0000)
committerbdilly <bdilly@users.sourceforge.net>
Thu, 16 Aug 2007 12:19:21 +0000 (12:19 +0000)
src/file.cpp
src/file.h
src/preferences-skeleton.h
src/ui/dialog/filedialog.cpp
src/ui/dialog/filedialog.h
src/ui/dialog/filedialogimpl-gtkmm.cpp
src/ui/dialog/filedialogimpl-gtkmm.h

index ebeef462e0a8b70e97ea3dff2103066654de3cbc..95dc9d07f746ded7a3364ac6a4b5a970af7211b1 100644 (file)
@@ -497,9 +497,6 @@ sp_file_vacuum()
 
 /**
  * This 'save' function called by the others below
- * It was divided in file_save_local and file_save_remote
- * to support remote saving too.
- * Now file_save is calling only local saving, but it will be solved.
  *
  * \param    official  whether to set :output_module and :modified in the
  *                     document; is true for normal save, false for temporary saves
@@ -511,31 +508,6 @@ file_save(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ustring &uri,
     if (!doc || uri.size()<1) //Safety check
         return false;
 
-#ifdef WITH_GNOME_VFS
-    
-//    if (gnome_vfs_initialized() && !gnome_vfs_uri_is_local(gnome_vfs_uri_new(uri.c_str()))) {
-//        // Use VFS for this
-//        bool success = file_save_remote(doc, uri, key, saveas, official);
-//        if (!success) {
-//            g_warning("Error:  Could not save file '%s' with VFS\n", uri.c_str());
-//            return false;  
-//        }    
-//        else
-//            return true;
-//    }
-//    else
-    return file_save_local(parentWindow, doc, uri, key, saveas, official);
-#else
-    
-    return file_save_local(parentWindow, doc, uri, key, saveas, official);
-    
-#endif
-}
-
-bool
-file_save_local(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ustring &uri,
-          Inkscape::Extension::Extension *key, bool saveas, bool official)
-{
     try {
         Inkscape::Extension::save(key, doc, uri.c_str(),
                  false,
@@ -564,9 +536,6 @@ file_save_local(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ustring
     return true;
 }
 
-
-
-
 /*
  * Used only for remote saving using VFS and a specific uri. Gets the file at the /tmp.
  */
@@ -618,12 +587,9 @@ file_save_remote(SPDocument *doc, const Glib::ustring &uri,
         return false;
     }
 
-    ///g_warning("file_save_remote: temp dir: %s",fileName.c_str());
-
     while (1) {
         
         result = gnome_vfs_read (from_handle, buffer, 8192, &bytes_read);
-        //g_warning("bytes lidos: %d",bytes_read);
 
         if ((result == GNOME_VFS_ERROR_EOF) &&(!bytes_read)){
             result = gnome_vfs_close (from_handle);
@@ -631,15 +597,11 @@ file_save_remote(SPDocument *doc, const Glib::ustring &uri,
             return true;
         }
         
-        //g_warning("while: %s", gnome_vfs_result_to_string(result));
-
         if (result != GNOME_VFS_OK) {
             g_warning("%s", gnome_vfs_result_to_string(result));
             return false;
         }
-        //g_warning("%s",buffer);
         result = gnome_vfs_write (to_handle, buffer, bytes_read, &bytes_written);
-        //g_warning("escritos: %d",bytes_written);
         if (result != GNOME_VFS_OK) {
             g_warning("%s", gnome_vfs_result_to_string(result));
             return false;
@@ -1043,6 +1005,7 @@ sp_file_import(Gtk::Window &parentWindow)
         else
             g_warning( "ERROR CONVERTING OPEN FILENAME TO UTF-8" );
 
+
         import_path = fileName;
         if (import_path.size()>0)
             import_path.append(G_DIR_SEPARATOR_S);
@@ -1175,16 +1138,8 @@ sp_file_export_dialog(void *widget)
     return false;
 }
 
-
-
-
-
-
-
 #else
 
-
-
 /**
  *
  */
@@ -1201,12 +1156,6 @@ sp_file_export_dialog(void *widget)
 ## E X P O R T  T O  O C A L
 ######################*/
 
-
-/**
- * Export the current document to OCAL
- */
-
-
 /**
  *  Display an Export dialog, export as the selected type if OK pressed
  */
@@ -1238,7 +1187,7 @@ sp_file_export_to_ocal_dialog(Gtk::Window &parentWindow)
 
     Inkscape::Extension::Output *extension;
         
-    //# Get the default extension name
+    // Get the default extension name
     Glib::ustring default_extension;
     char *attr = (char *)repr->attribute("inkscape:output_extension");
     if (!attr)
@@ -1268,7 +1217,7 @@ sp_file_export_to_ocal_dialog(Gtk::Window &parentWindow)
     if ( export_path_local.size() > 0) 
         export_path = export_path_local;
         
-    //# Show the Export To OCAL dialog
+    // Show the Export To OCAL dialog
     if (!exportDialogInstance)
         exportDialogInstance = Inkscape::UI::Dialog::FileExportToOCALDialog::create(
                 parentWindow,
@@ -1306,7 +1255,7 @@ sp_file_export_to_ocal_dialog(Gtk::Window &parentWindow)
         return success;
     }
     
-    /* Start now the submition */
+    // Start now the submition
     
     // Create the uri
     Glib::ustring uri = "dav://";
@@ -1329,7 +1278,9 @@ sp_file_export_to_ocal_dialog(Gtk::Window &parentWindow)
     return success;
 }
 
-
+/**
+ * Export the current document to OCAL
+ */
 void
 sp_file_export_to_ocal(Gtk::Window &parentWindow)
 {
@@ -1348,19 +1299,55 @@ sp_file_export_to_ocal(Gtk::Window &parentWindow)
 ######################*/
 
 /**
- * Import a document from OCAL
+ * Display an ImportToOcal Dialog, and the selected document from OCAL
  */
 void
 sp_file_import_from_ocal(Gtk::Window &parentWindow)
 {
-    // Try to execute the new code and return;
-    if (!SP_ACTIVE_DOCUMENT)
+    static Glib::ustring import_path;
+
+    SPDocument *doc = SP_ACTIVE_DOCUMENT;
+    if (!doc)
         return;
-    //bool success = sp_file_import_from_ocal_dialog(parentWindow);
-    //if (success)
-    //    SP_ACTIVE_DESKTOP->messageStack()->flash(Inkscape::IMMEDIATE_MESSAGE, _("Document imported..."));
-}
 
+    static Inkscape::UI::Dialog::FileImportFromOCALDialog *importDialogInstance = NULL;
+
+    if (!importDialogInstance) {
+        importDialogInstance =
+             Inkscape::UI::Dialog::FileImportFromOCALDialog::create(
+                 parentWindow,
+                 import_path,
+                 Inkscape::UI::Dialog::IMPORT_TYPES,
+                 (char const *)_("Import From OCAL"));
+    }
+
+    bool success = importDialogInstance->show();
+    if (!success)
+        return;
+
+    // Get file name and extension type
+    Glib::ustring fileName = importDialogInstance->getFilename();
+    Inkscape::Extension::Extension *selection =
+        importDialogInstance->getSelectionType();
+
+    if (fileName.size() > 0) {
+
+        Glib::ustring newFileName = Glib::filename_to_utf8(fileName);
+
+        if ( newFileName.size() > 0)
+            fileName = newFileName;
+        else
+            g_warning( "ERROR CONVERTING OPEN FILENAME TO UTF-8" );
+
+        import_path = fileName;
+        if (import_path.size()>0)
+            import_path.append(G_DIR_SEPARATOR_S);
+
+        file_import(doc, fileName, selection);
+    }
+
+    return;
+}
 
 /*######################
 ## P R I N T
index c5a854922907d74ca6babad7037b30d19e3bc429..7f960ab651410bcb5a7c129a601d1872c4227ac9 100644 (file)
@@ -79,14 +79,6 @@ void sp_file_revert_dialog ();
 ## S A V E
 ######################*/
 
-/*
- * Added to make only the local savings.
- */
-
-bool file_save_local(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ustring &uri,
-               Inkscape::Extension::Extension *key, bool saveas, bool official);
-
-
 /*
  * Added to make only the remote savings.
  */
@@ -94,8 +86,6 @@ bool file_save_local(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ust
 bool file_save_remote(SPDocument *doc, const Glib::ustring &uri,
                 Inkscape::Extension::Extension *key, bool saveas, bool official);
 
-
-
 /**
  *
  */
@@ -178,14 +168,6 @@ bool sp_file_export_to_ocal_dialog (void *widget);
 void sp_file_import_from_ocal (Gtk::Window &parentWindow );
 
 
-/**
- * Import a document from OCAL
- */
-//bool sp_file_import_from_ocal_dialog (void *widget);
-
-
-
-
 /*######################
 ## P R I N T
 ######################*/
index 8a04640e1c9518a164a859e3ed18d7f57bbab1e6..9e5514565cf3497fdeadb6d65c27a752915aeddf 100644 (file)
@@ -214,7 +214,7 @@ static char const preferences_skeleton[] =
 "    <group id=\"blurquality\" value=\"0\"/>\n"
 "    <group id=\"startmode\" outline=\"0\"/>\n"
 "    <group id=\"outlinemode\" value=\"0\"/>\n"
-"    <group id=\"ocalurl\" str=\"test.webdav.org/dav/\"/>\n"
+"    <group id=\"ocalurl\" str=\"openclipart.org\"/>\n"
 "    <group id=\"ocalusername\" str=\"\"/>\n"
 "    <group id=\"ocalpassword\" str=\"\"/>\n"
 "    <group id=\"wireframecolors\" "
index 63bb98b4b4b6432b471b348eb582a37f76d6ac62..88ba32679e24502d4ecadee6d721180b1de7ead6 100644 (file)
@@ -94,6 +94,21 @@ FileSaveDialog *FileSaveDialog::create(Gtk::Window& parentWindow,
     return dialog;
 }
 
+//#########################################################################
+//### F I L E    I M P O R T  F R O M  O C A L
+//#########################################################################
+
+/**
+ * Public factory.  Called by file.cpp.
+ */
+FileImportFromOCALDialog *FileImportFromOCALDialog::create(Gtk::Window &parentWindow,
+                                      const Glib::ustring &path,
+                                       FileDialogType fileTypes,
+                                       const Glib::ustring &title)
+{
+    FileImportFromOCALDialog *dialog = new FileImportFromOCALDialogImplGtk(parentWindow, path, fileTypes, title);
+    return dialog;
+}
 
 
 } //namespace Dialog
@@ -101,6 +116,7 @@ FileSaveDialog *FileSaveDialog::create(Gtk::Window& parentWindow,
 } //namespace Inkscape
 
 
+
 /*
   Local Variables:
   mode:c++
index 06d68fa72e05275ffb85cd71eb6c0cff6e291dc6..d98c37a28199cb6be7227644498173e4a0d7647f 100644 (file)
@@ -391,6 +391,59 @@ public:
 }; //FileExportToOCAL
 
 
+/**
+ * This class provides an implementation-independent API for
+ * file "ImportFromOCAL" dialogs. 
+ */
+class FileImportFromOCALDialog
+{
+public:
+
+
+    /**
+     * Constructor ..  do not call directly
+     * @param path the directory where to start searching
+     * @param fileTypes one of FileDialogTypes
+     * @param title the title of the dialog
+     */
+    FileImportFromOCALDialog()
+        {};
+
+    /**
+     * Factory.
+     * @param path the directory where to start searching
+     * @param fileTypes one of FileDialogTypes
+     * @param title the title of the dialog
+     */
+    static FileImportFromOCALDialog *create(Gtk::Window& parentWindow, 
+                                  const Glib::ustring &path,
+                                  FileDialogType fileTypes,
+                                  const Glib::ustring &title);
+
+
+    /**
+     * Destructor.
+     * Perform any necessary cleanups.
+     */
+    virtual ~FileImportFromOCALDialog() {};
+
+    /**
+     * Show an OpenFile file selector.
+     * @return the selected path if user selected one, else NULL
+     */
+    virtual bool show() =0;
+
+    /**
+     * Return the 'key' (filetype) of the selection, if any
+     * @return a pointer to a string if successful (which must
+     * be later freed with g_free(), else NULL.
+     */
+    virtual Inkscape::Extension::Extension * getSelectionType() = 0;
+
+    virtual Glib::ustring getFilename () =0;
+
+}; //FileImportFromOCALDialog
+
 
 } //namespace Dialog
 } //namespace UI
index 61d37e918be3c1add85290124ff29f24f92023a2..3357561b5b8c43ca7c0ef7b486e3c693de465da7 100644 (file)
@@ -4,6 +4,7 @@
  * Authors:\r
  *   Bob Jamison\r
  *   Joel Holdsworth\r
+ *   Bruno Dilly\r
  *   Other dudes from The Inkscape Organization\r
  *\r
  * Copyright (C) 2004-2007 Bob Jamison\r
 #include "filedialogimpl-gtkmm.h"\r
 #include "dialogs/dialog-events.h"\r
 \r
+#ifdef WITH_GNOME_VFS\r
+# include <libgnomevfs/gnome-vfs.h>\r
+#endif\r
+\r
 //Routines from file.cpp\r
 #undef INK_DUMP_FILENAME_CONV\r
 \r
@@ -1634,8 +1639,6 @@ void FileExportToOCALDialogImpl::fileNameEntryChangedCallback()
     if (!Glib::get_charset()) //If we are not utf8\r
         fileName = Glib::filename_to_utf8(fileName);\r
 \r
-    //g_message("User hit return.  Text is '%s'\n", fileName.c_str());\r
-\r
     myFilename = fileName;\r
     response(Gtk::RESPONSE_OK);\r
 }\r
@@ -1705,7 +1708,7 @@ FileExportToOCALDialogImpl::FileExportToOCALDialogImpl(Gtk::Window &parentWindow
             FileDialogType fileTypes,\r
             const Glib::ustring &title,\r
             const Glib::ustring &default_key) :\r
-    FileDialogExportBase(title)\r
+    FileDialogOCALBase(title)\r
 {\r
     /*\r
      * Start Taking the vertical Box and putting a Label\r
@@ -1720,7 +1723,6 @@ FileExportToOCALDialogImpl::FileExportToOCALDialogImpl(Gtk::Window &parentWindow
     /* Set our dialog type (save, export, etc...)*/\r
     dialogType = fileTypes;\r
     Gtk::VBox *vbox = get_vbox();\r
-    //Gtk::HBox fileBox;\r
 \r
     Gtk::Label *fileLabel = new Gtk::Label(_("File"));\r
 \r
@@ -1917,6 +1919,369 @@ void FileExportToOCALDialogImpl::updateNameAndExtension()
     }\r
 }\r
 \r
+//#########################################################################\r
+//### F I L E   I M P O R T   F R O M   O C A L\r
+//#########################################################################\r
+\r
+/*\r
+ * Callback for row activated\r
+ */\r
+void FileListViewText::on_row_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column)\r
+{\r
+    // create file path\r
+    myFilename = Glib::get_tmp_dir();\r
+    myFilename.append(G_DIR_SEPARATOR_S);\r
+    std::vector<int> posArray(1);\r
+    posArray = path.get_indices();\r
+    myFilename.append(get_text(posArray[0], 2));\r
+    \r
+#ifdef WITH_GNOME_VFS\r
+    gnome_vfs_init();\r
+    GnomeVFSHandle    *from_handle = NULL;\r
+    GnomeVFSHandle    *to_handle = NULL;\r
+    GnomeVFSFileSize  bytes_read;\r
+    GnomeVFSFileSize  bytes_written;\r
+    GnomeVFSResult    result;\r
+    guint8 buffer[8192];\r
+\r
+    //get file url\r
+    Glib::ustring fileUrl = get_text(posArray[0], 1); //http url\r
+\r
+    //Glib::ustring fileUrl = "dav://"; //dav url\r
+    //fileUrl.append(prefs_get_string_attribute("options.ocalurl", "str"));\r
+    //fileUrl.append("/dav/");\r
+    //fileUrl.append(get_text(posArray[0], 3)); //author dir\r
+    //fileUrl.append("/");\r
+    //fileUrl.append(get_text(posArray[0], 2)); //filename\r
+\r
+    if (!Glib::get_charset()) //If we are not utf8\r
+        fileUrl = Glib::filename_to_utf8(fileUrl);\r
+\r
+    // verifies if the file wasn't previously downloaded\r
+    if(gnome_vfs_open(&to_handle, myFilename.c_str(), GNOME_VFS_OPEN_READ) == GNOME_VFS_ERROR_NOT_FOUND)\r
+    {\r
+        // open the temp file to receive\r
+        result = gnome_vfs_open (&to_handle, myFilename.c_str(), GNOME_VFS_OPEN_WRITE);\r
+        if (result == GNOME_VFS_ERROR_NOT_FOUND){\r
+            result = gnome_vfs_create (&to_handle, myFilename.c_str(), GNOME_VFS_OPEN_WRITE, FALSE, GNOME_VFS_PERM_USER_ALL);\r
+        }\r
+        if (result != GNOME_VFS_OK) {\r
+            g_warning("Error creating temp file: %s", gnome_vfs_result_to_string(result));\r
+            return;\r
+        }\r
+        result = gnome_vfs_open (&from_handle, fileUrl.c_str(), GNOME_VFS_OPEN_READ);\r
+        if (result != GNOME_VFS_OK) {\r
+            g_warning("Could not find the file in Open Clip Art Library.");\r
+            return;\r
+        }\r
+        // copy the file\r
+        while (1) {\r
+            result = gnome_vfs_read (from_handle, buffer, 8192, &bytes_read);\r
+            if ((result == GNOME_VFS_ERROR_EOF) &&(!bytes_read)){\r
+                result = gnome_vfs_close (from_handle);\r
+                result = gnome_vfs_close (to_handle);\r
+                break;\r
+            }\r
+            if (result != GNOME_VFS_OK) {\r
+                g_warning("%s", gnome_vfs_result_to_string(result));\r
+                return;\r
+            }\r
+            result = gnome_vfs_write (to_handle, buffer, bytes_read, &bytes_written);\r
+            if (result != GNOME_VFS_OK) {\r
+                g_warning("%s", gnome_vfs_result_to_string(result));\r
+                return;\r
+            }\r
+            if (bytes_read != bytes_written){\r
+                g_warning("Bytes read not equal to bytes written");\r
+                return;\r
+            }\r
+        }\r
+    }\r
+    else\r
+    {\r
+        gnome_vfs_close(to_handle);\r
+    }\r
+    myPreview->showImage(myFilename);\r
+#endif\r
+}\r
+\r
+\r
+/*\r
+ * Returns the selected filename\r
+ */\r
+Glib::ustring FileListViewText::getFilename()\r
+{\r
+    return myFilename;\r
+}\r
+\r
+/**\r
+ * Callback for user input into searchTagEntry\r
+ */\r
+void FileImportFromOCALDialogImplGtk::searchTagEntryChangedCallback()\r
+{\r
+    if (!searchTagEntry)\r
+        return;\r
+\r
+    notFoundLabel->hide();\r
+\r
+    Glib::ustring searchTag = searchTagEntry->get_text();\r
+    // create the ocal uri to get rss feed\r
+    Glib::ustring uri = "http://www.";\r
+    uri.append(prefs_get_string_attribute("options.ocalurl", "str"));\r
+    uri.append("/media/feed/rss/");\r
+    uri.append(searchTag);\r
+    if (!Glib::get_charset()) //If we are not utf8\r
+        uri = Glib::filename_to_utf8(uri);\r
+\r
+#ifdef WITH_GNOME_VFS\r
+\r
+    // get the rss feed\r
+    gnome_vfs_init();\r
+    GnomeVFSHandle    *from_handle = NULL;\r
+    GnomeVFSHandle    *to_handle = NULL;\r
+    GnomeVFSFileSize  bytes_read;\r
+    GnomeVFSFileSize  bytes_written;\r
+    GnomeVFSResult    result;\r
+    guint8 buffer[8192];\r
+\r
+    // create the temp file name\r
+    Glib::ustring fileName = Glib::get_tmp_dir ();\r
+    fileName.append(G_DIR_SEPARATOR_S);\r
+    fileName.append("ocalfeed.xml");\r
+\r
+    // open the temp file to receive\r
+    result = gnome_vfs_open (&to_handle, fileName.c_str(), GNOME_VFS_OPEN_WRITE);\r
+    if (result == GNOME_VFS_ERROR_NOT_FOUND){\r
+        result = gnome_vfs_create (&to_handle, fileName.c_str(), GNOME_VFS_OPEN_WRITE, FALSE, GNOME_VFS_PERM_USER_ALL);\r
+    }\r
+    if (result != GNOME_VFS_OK) {\r
+        g_warning("Error creating temp file: %s", gnome_vfs_result_to_string(result));\r
+        return;\r
+    }\r
+\r
+    // open the rss feed\r
+    result = gnome_vfs_open (&from_handle, uri.c_str(), GNOME_VFS_OPEN_READ);\r
+    if (result != GNOME_VFS_OK) {\r
+        g_warning("Could not find the Open Clip Art Library rss feed. Verify if the OCAL url is correct in Configuration");\r
+        return;\r
+    }\r
+\r
+    // copy the file\r
+    while (1) {\r
+\r
+        result = gnome_vfs_read (from_handle, buffer, 8192, &bytes_read);\r
+\r
+        if ((result == GNOME_VFS_ERROR_EOF) &&(!bytes_read)){\r
+            result = gnome_vfs_close (from_handle);\r
+            result = gnome_vfs_close (to_handle);\r
+            break;\r
+        }\r
+\r
+        if (result != GNOME_VFS_OK) {\r
+            g_warning("%s", gnome_vfs_result_to_string(result));\r
+            return;\r
+        }\r
+        result = gnome_vfs_write (to_handle, buffer, bytes_read, &bytes_written);\r
+        if (result != GNOME_VFS_OK) {\r
+            g_warning("%s", gnome_vfs_result_to_string(result));\r
+            return;\r
+        }\r
+\r
+        if (bytes_read != bytes_written){\r
+            g_warning("Bytes read not equal to bytes written");\r
+            return;\r
+        }\r
+\r
+    }\r
+\r
+    // create the resulting xml document tree\r
+    // this initialize the library and test mistakes between compiled and shared library used\r
+    LIBXML_TEST_VERSION \r
+    xmlDoc *doc = NULL;\r
+    xmlNode *root_element = NULL;\r
+    doc = xmlReadFile(fileName.c_str(), NULL, 0);\r
+    if (doc == NULL) {\r
+        g_warning("Failed to parse %s\n", fileName.c_str());\r
+    return;\r
+    }\r
+    \r
+    // get the root element node\r
+    root_element = xmlDocGetRootElement(doc);\r
+\r
+    // clear the fileslist\r
+    filesList->clear_items();\r
+    filesList->set_sensitive(false);\r
+\r
+    // print all xml the element names\r
+    print_xml_element_names(root_element);\r
+\r
+    if (filesList->size() == 0)\r
+    {\r
+        notFoundLabel->show();\r
+        filesList->set_sensitive(false);\r
+    }\r
+    else\r
+        filesList->set_sensitive(true);\r
+\r
+    // free the document\r
+    xmlFreeDoc(doc);\r
+    // free the global variables that may have been allocated by the parser\r
+    xmlCleanupParser();\r
+    return;\r
+#endif    \r
+}\r
+\r
+/**\r
+ * Prints the names of the all the xml elements \r
+ * that are siblings or children of a given xml node\r
+ */\r
+void FileImportFromOCALDialogImplGtk::print_xml_element_names(xmlNode * a_node)\r
+{\r
+    xmlNode *cur_node = NULL;\r
+    guint row_num = 0;\r
+    for (cur_node = a_node; cur_node; cur_node = cur_node->next) {\r
+        // get itens information\r
+        if (strcmp((const char*)cur_node->name, "rss")) //avoid the root\r
+            if (cur_node->type == XML_ELEMENT_NODE && !strcmp((const char*)cur_node->parent->name, "item"))\r
+            {\r
+                if (!strcmp((const char*)cur_node->name, "title"))\r
+                {\r
+                    xmlChar *title = xmlNodeGetContent(cur_node);\r
+                    row_num = filesList->append_text((const char*)title);\r
+                    xmlFree(title);\r
+                }\r
+#ifdef WITH_GNOME_VFS\r
+                else if (!strcmp((const char*)cur_node->name, "enclosure"))\r
+                {\r
+                    xmlChar *urlattribute = xmlGetProp(cur_node, (xmlChar*)"url");\r
+                    filesList->set_text(row_num, 1, (const char*)urlattribute);\r
+                    gchar *tmp_file;\r
+                    tmp_file = gnome_vfs_uri_extract_short_path_name(gnome_vfs_uri_new((const char*)urlattribute));\r
+                    filesList->set_text(row_num, 2, (const char*)tmp_file);\r
+                    xmlFree(urlattribute);\r
+                }\r
+                else if (!strcmp((const char*)cur_node->name, "creator"))\r
+                {\r
+                    filesList->set_text(row_num, 3, (const char*)xmlNodeGetContent(cur_node));\r
+                }\r
+#endif\r
+            }\r
+        print_xml_element_names(cur_node->children);\r
+    }\r
+}\r
+\r
+/**\r
+ * Constructor.  Not called directly.  Use the factory.\r
+ */\r
+FileImportFromOCALDialogImplGtk::FileImportFromOCALDialogImplGtk(Gtk::Window& parentWindow, \r
+                                      const Glib::ustring &dir,\r
+                                       FileDialogType fileTypes,\r
+                                       const Glib::ustring &title) :\r
+     FileDialogOCALBase(title)\r
+{\r
+\r
+    // Initalize to Autodetect\r
+    extension = NULL;\r
+    // No filename to start out with\r
+    Glib::ustring searchTag = "";\r
+\r
+    dialogType = fileTypes;\r
+    Gtk::VBox *vbox = get_vbox();\r
+    Gtk::Label *tagLabel = new Gtk::Label(_("Search Tag"));\r
+    notFoundLabel = new Gtk::Label(_("No files matched your search"));\r
+    messageBox.pack_start(*notFoundLabel);\r
+    searchTagEntry = new Gtk::Entry();\r
+    searchTagEntry->set_text(searchTag);\r
+    searchTagEntry->set_max_length(252); // I am giving the extension approach.\r
+    tagBox.pack_start(*tagLabel);\r
+    tagBox.pack_start(*searchTagEntry, Gtk::PACK_EXPAND_WIDGET, 3);\r
+    filesPreview = new SVGPreview();\r
+    filesPreview->showNoPreview();\r
+    filesList = new FileListViewText(4, *filesPreview);\r
+    filesList->set_sensitive(false);\r
+    // add the listview inside a ScrolledWindow\r
+    listScrolledWindow.add(*filesList);\r
+    // only show the scrollbars when they are necessary:\r
+    listScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);\r
+    filesList->set_column_title(0, _("Files Found"));\r
+    listScrolledWindow.set_size_request(200, 180);\r
+    filesList->get_column(1)->set_visible(false); // file url\r
+    filesList->get_column(2)->set_visible(false); // tmp file path\r
+    filesList->get_column(3)->set_visible(false); // author dir\r
+    filesBox.pack_start(listScrolledWindow);\r
+    filesBox.pack_start(*filesPreview);\r
+    vbox->pack_start(tagBox);\r
+    vbox->pack_start(messageBox);\r
+    vbox->pack_start(filesBox);\r
+\r
+    //Let's do some customization\r
+    searchTagEntry = NULL;\r
+    Gtk::Container *cont = get_toplevel();\r
+    std::vector<Gtk::Entry *> entries;\r
+    findEntryWidgets(cont, entries);\r
+    if (entries.size() >=1 )\r
+    {\r
+    //Catch when user hits [return] on the text field\r
+        searchTagEntry = entries[0];\r
+        searchTagEntry->signal_activate().connect(\r
+              sigc::mem_fun(*this, &FileImportFromOCALDialogImplGtk::searchTagEntryChangedCallback));\r
+    }\r
+\r
+    add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);\r
+    set_default(*add_button(Gtk::Stock::OPEN,   Gtk::RESPONSE_OK));\r
+\r
+    show_all_children();\r
+    notFoundLabel->hide();\r
+}\r
+\r
+/**\r
+ * Destructor\r
+ */\r
+FileImportFromOCALDialogImplGtk::~FileImportFromOCALDialogImplGtk()\r
+{\r
+\r
+}\r
+\r
+/**\r
+ * Show this dialog modally.  Return true if user hits [OK]\r
+ */\r
+bool\r
+FileImportFromOCALDialogImplGtk::show()\r
+{\r
+    set_modal (TRUE);                      //Window\r
+    sp_transientize((GtkWidget *)gobj());  //Make transient\r
+    gint b = run();                        //Dialog\r
+    hide();\r
+\r
+    if (b == Gtk::RESPONSE_OK)\r
+    {\r
+        return TRUE;\r
+    }\r
+    else\r
+    {\r
+        return FALSE;\r
+    }\r
+}\r
+\r
+\r
+/**\r
+ * Get the file extension type that was selected by the user. Valid after an [OK]\r
+ */\r
+Inkscape::Extension::Extension *\r
+FileImportFromOCALDialogImplGtk::getSelectionType()\r
+{\r
+    return extension;\r
+}\r
+\r
+\r
+/**\r
+ * Get the file name chosen by the user.   Valid after an [OK]\r
+ */\r
+Glib::ustring\r
+FileImportFromOCALDialogImplGtk::getFilename (void)\r
+{\r
+    return filesList->getFilename();\r
+}\r
 \r
 } //namespace Dialog\r
 } //namespace UI\r
index fa8edda8583a6eeb1088e83a2fb62cc87721f0e6..375ec23adbf893caff726c099597fabdb3f6c9d0 100644 (file)
@@ -4,6 +4,7 @@
  * Authors:\r
  *   Bob Jamison\r
  *   Joel Holdsworth\r
+ *   Bruno Dilly\r
  *   Other dudes from The Inkscape Organization\r
  *\r
  * Copyright (C) 2004-2007 Bob Jamison\r
@@ -21,6 +22,9 @@
 #include <sys/stat.h>\r
 #include <errno.h>\r
 #include <set>\r
+#include <libxml/parser.h>\r
+#include <libxml/tree.h>\r
+\r
 \r
 //Gtk includes\r
 #include <glibmm/i18n.h>\r
@@ -565,25 +569,25 @@ private:
 \r
 \r
 /*#########################################################################\r
-### F I L E     D I A L O G    E X P O R T    B A S E    C L A S S\r
+### F I L E     D I A L O G    O C A L    B A S E    C L A S S\r
 #########################################################################*/\r
 \r
 /**\r
  * This class is the base implementation for export to OCAL.\r
  */\r
-class FileDialogExportBase : public Gtk::Dialog\r
+class FileDialogOCALBase : public Gtk::Dialog\r
 {\r
 public:\r
 \r
     /**\r
      *\r
      */\r
-    FileDialogExportBase(const Glib::ustring &title) : Gtk::Dialog(title,true)\r
+    FileDialogOCALBase(const Glib::ustring &title) : Gtk::Dialog(title,true)\r
     {}\r
     /*\r
      *\r
      */\r
-    virtual ~FileDialogExportBase()\r
+    virtual ~FileDialogOCALBase()\r
     {}\r
 \r
 protected:\r
@@ -608,7 +612,7 @@ protected:
 /**\r
  * Our implementation of the FileExportToOCALDialog interface.\r
  */\r
-class FileExportToOCALDialogImpl : public FileExportToOCALDialog, public FileDialogExportBase\r
+class FileExportToOCALDialogImpl : public FileExportToOCALDialog, public FileDialogOCALBase\r
 {\r
 \r
 public:\r
@@ -650,7 +654,7 @@ private:
      */\r
     std::vector<FileType> fileTypes;\r
 \r
-    //# Child widgets\r
+    // Child widgets\r
     Gtk::HBox childBox;\r
     Gtk::VBox checksBox;\r
     Gtk::HBox fileBox;\r
@@ -685,6 +689,82 @@ private:
 };\r
 \r
 \r
+//#########################################################################\r
+//### F I L E   I M P O R T   F R O M   O C A L\r
+//#########################################################################\r
+\r
+/**\r
+ * Our implementation class for filesListView\r
+ */\r
+class FileListViewText : public Gtk::ListViewText\r
+{\r
+public:\r
+    FileListViewText(guint columns_count, SVGPreview& filesPreview):ListViewText(columns_count)\r
+    {\r
+        myPreview = &filesPreview;\r
+    }\r
+    Glib::ustring getFilename();\r
+protected:\r
+    void on_row_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column);\r
+private:\r
+    Glib::ustring myFilename;\r
+    SVGPreview *myPreview;\r
+};\r
+\r
+/**\r
+ * Our implementation class for the FileImportFromOCALDialog interface..\r
+ */\r
+class FileImportFromOCALDialogImplGtk : public FileImportFromOCALDialog, public FileDialogOCALBase\r
+{\r
+public:\r
+\r
+    FileImportFromOCALDialogImplGtk(Gtk::Window& parentWindow,\r
+                      const Glib::ustring &dir,\r
+                       FileDialogType fileTypes,\r
+                       const Glib::ustring &title);\r
+\r
+    virtual ~FileImportFromOCALDialogImplGtk();\r
+\r
+    bool show();\r
+\r
+    Inkscape::Extension::Extension *getSelectionType();\r
+\r
+    Glib::ustring getFilename();\r
+\r
+private:\r
+\r
+    /**\r
+     * Allow the user to type the tag to be searched\r
+     */\r
+    Gtk::Entry *searchTagEntry;\r
+    FileListViewText *filesList;\r
+    SVGPreview *filesPreview;\r
+    Gtk::Label *notFoundLabel;\r
+\r
+    // Child widgets\r
+    Gtk::HBox tagBox;\r
+    Gtk::HBox filesBox;\r
+    Gtk::HBox messageBox;\r
+    Gtk::ScrolledWindow listScrolledWindow;\r
+    Glib::RefPtr<Gtk::TreeSelection> selection;\r
+\r
+    /**\r
+     * Callback for user input into searchTagEntry\r
+     */\r
+    void searchTagEntryChangedCallback();\r
+\r
+\r
+    /**\r
+     * Prints the names of the all the xml elements \r
+     * that are siblings or children of a given xml node\r
+     */\r
+    void print_xml_element_names(xmlNode * a_node);\r
+\r
+    /**\r
+     * The extension to use to write this file\r
+     */\r
+    Inkscape::Extension::Extension *extension;\r
+};\r
 \r
 }\r
 }\r