Code

C++ification of SPObject continued along with the onset of XML Privatisation. Users...
[inkscape.git] / src / ui / dialog / document-properties.cpp
index bb9ab4d02676343fb26ced97b0d0841e4530a19f..4e1ddda2e7b2d95dfa4c54205d3ec8f38182d7d4 100644 (file)
@@ -222,7 +222,7 @@ DocumentProperties::build_page()
     Gtk::Label* label_bor = manage (new Gtk::Label);
     label_bor->set_markup (_("<b>Border</b>"));
     Gtk::Label *label_for = manage (new Gtk::Label);
-    label_for->set_markup (_("<b>Format</b>"));
+    label_for->set_markup (_("<b>Page Size</b>"));
     _page_sizer.init();
 
     Gtk::Widget *const widget_array[] =
@@ -353,6 +353,7 @@ DocumentProperties::populate_available_profiles(){
                 while ((filename = (gchar *)g_dir_read_name(directory)) != NULL) {
                     gchar* full = g_build_filename(it->c_str(), filename, NULL);
                     if ( !Inkscape::IO::file_test( full, G_FILE_TEST_IS_DIR ) ) {
+                        cmsErrorAction( LCMS_ERROR_SHOW );
                         cmsHPROFILE hProfile = cmsOpenProfileFromFile(full, "r");
                         if (hProfile != NULL){
                             const gchar* name;
@@ -381,6 +382,39 @@ DocumentProperties::populate_available_profiles(){
     _menu.show_all();
 }
 
+/**
+ * Cleans up name to remove disallowed characters.
+ * Some discussion at http://markmail.org/message/bhfvdfptt25kgtmj
+ * Allowed ASCII first characters:  ':', 'A'-'Z', '_', 'a'-'z'
+ * Allowed ASCII remaining chars add: '-', '.', '0'-'9', 
+ *
+ * @param str the string to clean up.
+ */
+static void sanitizeName( Glib::ustring& str )
+{
+    if (str.size() > 1) {
+        char val = str.at(0);
+        if (((val < 'A') || (val > 'Z'))
+            && ((val < 'a') || (val > 'z'))
+            && (val != '_')
+            && (val != ':')) {
+            str.replace(0, 1, "-");
+        }
+        for (Glib::ustring::size_type i = 1; i < str.size(); i++) {
+            char val = str.at(i);
+            if (((val < 'A') || (val > 'Z'))
+                && ((val < 'a') || (val > 'z'))
+                && ((val < '0') || (val > '9'))
+                && (val != '_')
+                && (val != ':')
+                && (val != '-')
+                && (val != '.')) {
+                str.replace(i, 1, "-");
+            }
+        }
+    }
+}
+
 void
 DocumentProperties::linkSelectedProfile()
 {
@@ -396,7 +430,10 @@ DocumentProperties::linkSelectedProfile()
         }
         Inkscape::XML::Document *xml_doc = sp_document_repr_doc(desktop->doc());
         Inkscape::XML::Node *cprofRepr = xml_doc->createElement("svg:color-profile");
-        cprofRepr->setAttribute("name", (gchar*) _menu.get_active()->get_data("name"));
+        gchar* tmp = static_cast<gchar*>(_menu.get_active()->get_data("name"));
+        Glib::ustring nameStr = tmp ? tmp : "profile"; // TODO add some auto-numbering to avoid collisions
+        sanitizeName(nameStr);
+        cprofRepr->setAttribute("name", nameStr.c_str());
         cprofRepr->setAttribute("xlink:href", (gchar*) _menu.get_active()->get_data("filepath"));
 
         // Checks whether there is a defs element. Creates it when needed
@@ -413,7 +450,7 @@ DocumentProperties::linkSelectedProfile()
         //Inkscape::GC::release(defsRepr);
 
         // inform the document, so we can undo
-        sp_document_done(desktop->doc(), SP_VERB_EDIT_LINK_COLOR_PROFILE, _("Link Color Profile"));
+        SPDocumentUndo::done(desktop->doc(), SP_VERB_EDIT_LINK_COLOR_PROFILE, _("Link Color Profile"));
 
         populate_linked_profiles_box();
     }
@@ -423,7 +460,7 @@ void
 DocumentProperties::populate_linked_profiles_box()
 {
     _LinkedProfilesListStore->clear();
-    const GSList *current = sp_document_get_resource_list( SP_ACTIVE_DOCUMENT, "iccprofile" );
+    const GSList *current = SP_ACTIVE_DOCUMENT->get_resource_list( "iccprofile" );
     if (current) _emb_profiles_observer.set(SP_OBJECT(current->data)->parent);
     while ( current ) {
         SPObject* obj = SP_OBJECT(current->data);
@@ -480,13 +517,15 @@ void DocumentProperties::removeSelectedProfile(){
         }
     }
 
-    const GSList *current = sp_document_get_resource_list( SP_ACTIVE_DOCUMENT, "iccprofile" );
+    const GSList *current = SP_ACTIVE_DOCUMENT->get_resource_list( "iccprofile" );
     while ( current ) {
         SPObject* obj = SP_OBJECT(current->data);
         Inkscape::ColorProfile* prof = reinterpret_cast<Inkscape::ColorProfile*>(obj);
         if (!name.compare(prof->name)){
-            sp_repr_unparent(obj->repr);
-            sp_document_done(SP_ACTIVE_DOCUMENT, SP_VERB_EDIT_REMOVE_COLOR_PROFILE, _("Remove linked color profile"));
+
+                       //XML Tree being used directly here while it shouldn't be.
+            sp_repr_unparent(obj->getRepr());
+            SPDocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_EDIT_REMOVE_COLOR_PROFILE, _("Remove linked color profile"));
         }
         current = g_slist_next(current);
     }
@@ -552,7 +591,7 @@ DocumentProperties::build_cms()
     _LinkedProfilesList.signal_button_release_event().connect_notify(sigc::mem_fun(*this, &DocumentProperties::linked_profiles_list_button_release));
     cms_create_popup_menu(_LinkedProfilesList, sigc::mem_fun(*this, &DocumentProperties::removeSelectedProfile));
 
-    const GSList *current = sp_document_get_resource_list( SP_ACTIVE_DOCUMENT, "defs" );
+    const GSList *current = SP_ACTIVE_DOCUMENT->get_resource_list( "defs" );
     if (current) {
         _emb_profiles_observer.set(SP_OBJECT(current->data)->parent);
     }
@@ -610,7 +649,7 @@ DocumentProperties::build_scripting()
 #endif // ENABLE_LCMS
 
 //TODO: review this observers code:
-    const GSList *current = sp_document_get_resource_list( SP_ACTIVE_DOCUMENT, "script" );
+    const GSList *current = SP_ACTIVE_DOCUMENT->get_resource_list( "script" );
     if (current) {
         _ext_scripts_observer.set(SP_OBJECT(current->data)->parent);
     }
@@ -631,7 +670,7 @@ void DocumentProperties::addExternalScript(){
         xml_doc->root()->addChild(scriptRepr, NULL);
 
         // inform the document, so we can undo
-        sp_document_done(desktop->doc(), SP_VERB_EDIT_ADD_EXTERNAL_SCRIPT, _("Add external script..."));
+        SPDocumentUndo::done(desktop->doc(), SP_VERB_EDIT_ADD_EXTERNAL_SCRIPT, _("Add external script..."));
 
         populate_external_scripts_box();
     }
@@ -649,13 +688,15 @@ void DocumentProperties::removeExternalScript(){
         }
     }
 
-    const GSList *current = sp_document_get_resource_list( SP_ACTIVE_DOCUMENT, "script" );
+    const GSList *current = SP_ACTIVE_DOCUMENT->get_resource_list( "script" );
     while ( current ) {
         SPObject* obj = SP_OBJECT(current->data);
         SPScript* script = (SPScript*) obj;
-        if (!name.compare(script->xlinkhref)){
-            sp_repr_unparent(obj->repr);
-            sp_document_done(SP_ACTIVE_DOCUMENT, SP_VERB_EDIT_REMOVE_EXTERNAL_SCRIPT, _("Remove external script"));
+        if (name == script->xlinkhref){
+
+                       //XML Tree being used directly here while it shouldn't be.
+            sp_repr_unparent(obj->getRepr());
+            SPDocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_EDIT_REMOVE_EXTERNAL_SCRIPT, _("Remove external script"));
         }
         current = g_slist_next(current);
     }
@@ -666,13 +707,17 @@ void DocumentProperties::removeExternalScript(){
 
 void DocumentProperties::populate_external_scripts_box(){
     _ExternalScriptsListStore->clear();
-    const GSList *current = sp_document_get_resource_list( SP_ACTIVE_DOCUMENT, "script" );
+    const GSList *current = SP_ACTIVE_DOCUMENT->get_resource_list( "script" );
     if (current) _ext_scripts_observer.set(SP_OBJECT(current->data)->parent);
     while ( current ) {
         SPObject* obj = SP_OBJECT(current->data);
         SPScript* script = (SPScript*) obj;
-        Gtk::TreeModel::Row row = *(_ExternalScriptsListStore->append());
-        row[_ExternalScriptsListColumns.filenameColumn] = script->xlinkhref;
+        if (script->xlinkhref)
+        {
+            Gtk::TreeModel::Row row = *(_ExternalScriptsListStore->append());
+            row[_ExternalScriptsListColumns.filenameColumn] = script->xlinkhref;
+        }
+
         current = g_slist_next(current);
     }
 }
@@ -781,9 +826,10 @@ DocumentProperties::update()
     if (nv->doc_units)
         _rum_deflt.setUnit (nv->doc_units);
 
-    double const doc_w_px = sp_document_width(sp_desktop_document(dt));
-    double const doc_h_px = sp_document_height(sp_desktop_document(dt));
+    double const doc_w_px = sp_desktop_document(dt)->getWidth();
+    double const doc_h_px = sp_desktop_document(dt)->getHeight();
     _page_sizer.setDim (doc_w_px, doc_h_px);
+    _page_sizer.updateFitMarginsUI(SP_OBJECT_REPR(nv));
 
     //-----------------------------------------------------------guide page
 
@@ -943,7 +989,7 @@ DocumentProperties::onRemoveGrid()
         // delete the grid that corresponds with the selected tab
         // when the grid is deleted from SVG, the SPNamedview handler automatically deletes the object, so found_grid becomes an invalid pointer!
         found_grid->repr->parent()->removeChild(found_grid->repr);
-        sp_document_done(sp_desktop_document(dt), SP_VERB_DIALOG_NAMEDVIEW, _("Remove grid"));
+        SPDocumentUndo::done(sp_desktop_document(dt), SP_VERB_DIALOG_NAMEDVIEW, _("Remove grid"));
     }
 }