Code

copyedit
[inkscape.git] / src / ui / widget / page-sizer.cpp
index 642f64c43342b361ac724ffd80dd588b53b32b65..f193f04d20fa44aa9bc65e783e7023cb6bc8eb16 100644 (file)
@@ -7,7 +7,7 @@
  *   Lauris Kaplinski <lauris@kaplinski.com>
  *   Jon Phillips <jon@rejon.org>
  *   Ralf Stephan <ralf@ark.in-berlin.de> (Gtkmm)
- *   Bob Jamison <ishmal@users.sf.net> 
+ *   Bob Jamison <ishmal@users.sf.net>
  *
  * Copyright (C) 2000 - 2006 Authors
  *
@@ -54,7 +54,7 @@ namespace Widget {
      * this table and in ghostscript.
      *
      * The versions here, in mm, are the official sizes according to
-     * <a href="http://en.wikipedia.org/wiki/Paper_sizes">http://en.wikipedia.org/wiki/Paper_sizes</a> 
+     * <a href="http://en.wikipedia.org/wiki/Paper_sizes">http://en.wikipedia.org/wiki/Paper_sizes</a>
      * at 2005-01-25.  (The ISO entries in the below table
      * were produced mechanically from the table on that page.)
      *
@@ -74,7 +74,7 @@ namespace Widget {
      * inconsistent rounding rules when converting from mm to pt.
      */
     /** \todo
-     * Should we include the JIS B series (used in Japan)  
+     * Should we include the JIS B series (used in Japan)
      * (JIS B0 is sometimes called JB0, and similarly for JB1 etc)?
      * Should we exclude B7--B10 and A7--10 to make the list smaller ?
      * Should we include any of the ISO C, D and E series (see below) ?
@@ -117,12 +117,12 @@ static PaperSizeRec const inkscape_papers[] = {
 
 
 //#if 0
-         /* 
+         /*
          Whether to include or exclude these depends on how
          big we mind our page size menu
          becoming.  C series is used for envelopes;
-                don't know what D and E series are used for.
-                */
+         don't know what D and E series are used for.
+         */
 
     { "C0",                917, 1297, SP_UNIT_MM },
     { "C1",                648,  917, SP_UNIT_MM },
@@ -152,11 +152,11 @@ static PaperSizeRec const inkscape_papers[] = {
 
     { "CSE",               462,  649, SP_UNIT_PT },
     { "US #10 Envelope", 4.125,  9.5, SP_UNIT_IN },
-        // TODO: Select landscape by default.
+    // TODO: Select landscape by default.
     /* See http://www.hbp.com/content/PCR_envelopes.cfm for a much larger list of US envelope
        sizes. */
     { "DL Envelope",       110,  220, SP_UNIT_MM },
-        // TODO: Select landscape by default.
+    // TODO: Select landscape by default.
     { "Ledger/Tabloid",     11,   17, SP_UNIT_IN },
     /* Note that `Folio' (used in QPrinter/KPrinter) is deliberately absent from this list, as it
        means different sizes to different people: different people may expect the width to be
@@ -165,7 +165,7 @@ static PaperSizeRec const inkscape_papers[] = {
        page size to the list, then please consider using a name more specific than just `Folio' or
        `Foolscap Folio'. */
     { "Banner 468x60",      60,  468, SP_UNIT_PX },
-         // TODO: Select landscape by default.
+    // TODO: Select landscape by default.
     { "Icon 16x16",         16,   16, SP_UNIT_PX },
     { "Icon 32x32",         32,   32, SP_UNIT_PX },
     { "Icon 48x48",         48,   48, SP_UNIT_PX },
@@ -184,33 +184,36 @@ static const SPUnit _px_unit = sp_unit_get_by_id (SP_UNIT_PX);
 
 /**
  * Constructor
- */ 
-PageSizer::PageSizer() : Gtk::VBox(false,4)
+ */
+PageSizer::PageSizer(Registry & _wr)
+    : Gtk::VBox(false,4),
+      _dimensionUnits( _("U_nits:"), "units", _wr ),
+      _dimensionWidth( _("_Width:"), _("Width of paper"), "width", _dimensionUnits, _wr ),
+      _dimensionHeight( _("_Height:"), _("Height of paper"), "height", _dimensionUnits, _wr ),
+      _widgetRegistry(&_wr)
 {
-
-
-    //# Set up the Paper Size combo box    
+    //# Set up the Paper Size combo box
     _paperSizeListStore = Gtk::ListStore::create(_paperSizeListColumns);
     _paperSizeList.set_model(_paperSizeListStore);
     _paperSizeList.append_column(_("Name"),
-                _paperSizeListColumns.nameColumn);
+                                 _paperSizeListColumns.nameColumn);
     _paperSizeList.append_column(_("Description"),
-                _paperSizeListColumns.descColumn);
-       _paperSizeList.set_headers_visible(false);
+                                 _paperSizeListColumns.descColumn);
+    _paperSizeList.set_headers_visible(false);
     _paperSizeListSelection = _paperSizeList.get_selection();
-    _paper_size_list_connection = 
-               _paperSizeListSelection->signal_changed().connect (
-               sigc::mem_fun (*this, &PageSizer::on_paper_size_list_changed));
-       _paperSizeListScroller.add(_paperSizeList);
-       _paperSizeListScroller.set_shadow_type(Gtk::SHADOW_IN);
-       _paperSizeListScroller.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS);
-       _paperSizeListScroller.set_size_request(-1, 90);
-               
+    _paper_size_list_connection =
+        _paperSizeListSelection->signal_changed().connect (
+            sigc::mem_fun (*this, &PageSizer::on_paper_size_list_changed));
+    _paperSizeListScroller.add(_paperSizeList);
+    _paperSizeListScroller.set_shadow_type(Gtk::SHADOW_IN);
+    _paperSizeListScroller.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS);
+    _paperSizeListScroller.set_size_request(-1, 90);
+
     for (PaperSizeRec const *p = inkscape_papers; p->name; p++)
-           {
+    {
         Glib::ustring name = p->name;
         char formatBuf[80];
-        snprintf(formatBuf, 79, "%0.2f x %0.2f", p->smaller, p->larger);
+        snprintf(formatBuf, 79, "%0.1f x %0.1f", p->smaller, p->larger);
         Glib::ustring desc = formatBuf;
         if (p->unit == SP_UNIT_IN)
             desc.append(" in");
@@ -224,9 +227,9 @@ PageSizer::PageSizer() : Gtk::VBox(false,4)
         row[_paperSizeListColumns.nameColumn] = name;
         row[_paperSizeListColumns.descColumn] = desc;
         }
-    //Gtk::TreeModel::Row row = _paperSizeListStore->children()[0];
-    //if (row)
-    //    _paperSizeListSelection->select(row);
+    //Gtk::TreeModel::iterator iter = _paperSizeListStore->children().begin();
+    //if (iter)
+    //    _paperSizeListSelection->select(iter);
 
 
     pack_start (_paperSizeListBox, false, false, 0);
@@ -238,18 +241,20 @@ PageSizer::PageSizer() : Gtk::VBox(false,4)
 
     //## Set up orientation radio buttons
     pack_start (_orientationBox, false, false, 0);
-    _orientationLabel.set_label(_("Page orientation:")); 
+    _orientationLabel.set_label(_("Page orientation:"));
     _orientationBox.pack_start(_orientationLabel, false, false, 0);
+    _landscapeButton.set_use_underline();
     _landscapeButton.set_label(_("_Landscape"));
-       _landscapeButton.set_active(true);
+    _landscapeButton.set_active(true);
     Gtk::RadioButton::Group group = _landscapeButton.get_group();
     _orientationBox.pack_end (_landscapeButton, false, false, 5);
+    _portraitButton.set_use_underline();
     _portraitButton.set_label(_("_Portrait"));
-       _portraitButton.set_active(true);
+    _portraitButton.set_active(true);
     _orientationBox.pack_end (_portraitButton, false, false, 5);
     _portraitButton.set_group (group);
     _portraitButton.set_active (true);
-    
+
     //## Set up custom size frame
     _customFrame.set_label(_("Custom size"));
     pack_start (_customFrame, false, false, 0);
@@ -257,20 +262,21 @@ PageSizer::PageSizer() : Gtk::VBox(false,4)
     _customTable.set_border_width (4);
     _customTable.set_row_spacings (4);
     _customTable.set_col_spacings (4);
+    _customTable.attach(_dimensionWidth, 0,1,0,1);
+    _customTable.attach(_dimensionUnits, 1,2,0,1);
+    _customTable.attach(_dimensionHeight, 0,1,1,2);
+    _customTable.attach(_fitPageButton,              1,2,1,2);
     _customFrame.add(_customTable);
-    
-    _fitPageButton.set_label(_("_Fit page to selection"));
-    _tips.set_tip(_fitPageButton, 
-       _("Resize the page to fit the current selection, or the entire drawing if there is no selection"));
-
-
 
+    _fitPageButton.set_use_underline();
+    _fitPageButton.set_label(_("_Fit page to selection"));
+    _tips.set_tip(_fitPageButton, _("Resize the page to fit the current selection, or the entire drawing if there is no selection"));
 }
 
 
 /**
  * Destructor
- */ 
+ */
 PageSizer::~PageSizer()
 {
 }
@@ -279,45 +285,17 @@ PageSizer::~PageSizer()
 
 /**
  * Initialize or reset this widget
- */ 
+ */
 void
-PageSizer::init (Registry& reg)
+PageSizer::init ()
 {
+    _landscape_connection = _landscapeButton.signal_toggled().connect (sigc::mem_fun (*this, &PageSizer::on_landscape));
+    _portrait_connection = _portraitButton.signal_toggled().connect (sigc::mem_fun (*this, &PageSizer::on_portrait));
+    _changedw_connection = _dimensionWidth.signal_value_changed().connect (sigc::mem_fun (*this, &PageSizer::on_value_changed));
+    _changedh_connection = _dimensionHeight.signal_value_changed().connect (sigc::mem_fun (*this, &PageSizer::on_value_changed));
+    _fitPageButton.signal_clicked().connect(sigc::mem_fun(*this, &PageSizer::fire_fit_canvas_to_selection_or_drawing));
 
-    /*
-    Note that the registered widgets can only be placed onto a
-    container after they have been init()-ed.  That is why some
-    of the widget creation is in the constructor, and the rest is
-    here.
-    */
-    
-    _widgetRegistry = &reg;
-
-    _dimensionUnits.init (_("U_nits:"), "units",
-                        *_widgetRegistry);
-    _dimensionWidth.init (_("_Width:"), _("Width of paper"), "width",
-                        _dimensionUnits, *_widgetRegistry);
-    _dimensionHeight.init (_("_Height:"), _("Height of paper"), "height",
-                        _dimensionUnits, *_widgetRegistry);
-
-    _customTable.attach(*(_dimensionWidth.getSU()),  0,1,0,1);
-    _customTable.attach(*(_dimensionUnits._sel),     1,2,0,1);
-    _customTable.attach(*(_dimensionHeight.getSU()), 0,1,1,2);
-    _customTable.attach(_fitPageButton,              1,2,1,2);
-
-    _landscape_connection = _landscapeButton.signal_toggled().connect (
-               sigc::mem_fun (*this, &PageSizer::on_landscape));
-    _portrait_connection = _portraitButton.signal_toggled().connect (
-               sigc::mem_fun (*this, &PageSizer::on_portrait));
-    _changedw_connection = _dimensionWidth.getSU()->signal_value_changed().connect (
-               sigc::mem_fun (*this, &PageSizer::on_value_changed));
-    _changedh_connection = _dimensionHeight.getSU()->signal_value_changed().connect (
-               sigc::mem_fun (*this, &PageSizer::on_value_changed));
-    _fitPageButton.signal_clicked().connect(
-            sigc::mem_fun(*this, &PageSizer::fire_fit_canvas_to_selection_or_drawing));
-    
     show_all_children();
-
 }
 
 
@@ -325,23 +303,24 @@ PageSizer::init (Registry& reg)
  * Set document dimensions (if not called by Doc prop's update()) and
  * set the PageSizer's widgets and text entries accordingly. If
  * 'chageList' is true, then adjust the paperSizeList to show the closest
- * standard page size.  
+ * standard page size.
  *
  * \param w, h given in px
- * \param changeList whether to modify the paper size list 
+ * \param changeList whether to modify the paper size list
  */
 void
 PageSizer::setDim (double w, double h, bool changeList)
 {
     static bool _called = false;
-    if (_called)
-           return;
+    if (_called) {
+        return;
+    }
 
     _called = true;
-    
+
     _paper_size_list_connection.block();
-       _landscape_connection.block();
-    _portrait_connection.block(); 
+    _landscape_connection.block();
+    _portrait_connection.block();
     _changedw_connection.block();
     _changedh_connection.block();
 
@@ -349,41 +328,40 @@ PageSizer::setDim (double w, double h, bool changeList)
         SPDocument *doc = sp_desktop_document(SP_ACTIVE_DESKTOP);
         sp_document_set_width (doc, w, &_px_unit);
         sp_document_set_height (doc, h, &_px_unit);
-        sp_document_done (doc, SP_VERB_NONE, 
-        /* TODO: annotate */ "page-sizer.cpp:301");
-    } 
-    
+        sp_document_done (doc, SP_VERB_NONE, _("Set page size"));
+    }
+
     _landscape = ( w > h );
     _landscapeButton.set_active(_landscape ? true : false);
     _portraitButton.set_active (_landscape ? false : true);
-    
+
     if (changeList)
         {
-        int index = find_paper_size(w, h);
-        Gtk::TreeModel::Row row = _paperSizeListStore->children()[index];
+        Gtk::TreeModel::Row row = (*find_paper_size(w, h));
         if (row)
             _paperSizeListSelection->select(row);
         }
-    
-    Unit const& unit = _dimensionUnits._sel->getUnit();
+
+    Unit const& unit = _dimensionUnits.getUnit();
     _dimensionWidth.setValue (w / unit.factor);
     _dimensionHeight.setValue (h / unit.factor);
 
     _paper_size_list_connection.unblock();
-       _landscape_connection.unblock();
+    _landscape_connection.unblock();
     _portrait_connection.unblock();
     _changedw_connection.unblock();
     _changedh_connection.unblock();
-    
+
     _called = false;
 }
 
 
-/** 
- * Returns an index into paperSizeTable of a paper of the specified 
- * size (specified in px), or -1 if there's no such paper.
+/**
+ * Returns an iterator pointing to a row in paperSizeListStore which
+ * contains a paper of the specified size (specified in px), or
+ * paperSizeListStore->children().end() if no such paper exists.
  */
-int
+Gtk::ListStore::iterator
 PageSizer::find_paper_size (double w, double h) const
 {
     double smaller = w;
@@ -392,44 +370,51 @@ PageSizer::find_paper_size (double w, double h) const
         smaller = h; larger = w;
     }
 
-    g_return_val_if_fail(smaller <= larger, -1);
-    
-    int index = 0;
+    g_return_val_if_fail(smaller <= larger, _paperSizeListStore->children().end());
+
     std::map<Glib::ustring, PaperSize>::const_iterator iter;
     for (iter = _paperSizeTable.begin() ;
-            iter != _paperSizeTable.end() ; iter++) {
+         iter != _paperSizeTable.end() ; iter++) {
         PaperSize paper = iter->second;
         SPUnit const &i_unit = sp_unit_get_by_id(paper.unit);
         double smallX = sp_units_get_pixels(paper.smaller, i_unit);
         double largeX = sp_units_get_pixels(paper.larger,  i_unit);
-        
-        g_return_val_if_fail(smallX <= largeX, -1);
-        
+
+        g_return_val_if_fail(smallX <= largeX, _paperSizeListStore->children().end());
+
         if ((std::abs(smaller - smallX) <= 0.1) &&
-            (std::abs(larger  - largeX) <= 0.1)   )
-            return index;
-            
-        index++;
+            (std::abs(larger  - largeX) <= 0.1)   ) {
+            Gtk::ListStore::iterator p;
+            // We need to search paperSizeListStore explicitly for the
+            // specified paper size because it is sorted in a different
+            // way than paperSizeTable (which is sorted alphabetically)
+            for (p = _paperSizeListStore->children().begin(); p != _paperSizeListStore->children().end(); p++) {
+                if ((*p)[_paperSizeListColumns.nameColumn] == paper.name) {
+                    return p;
+                }
+            }
+        }
     }
-    return -1;
+    return _paperSizeListStore->children().end();
 }
 
 
 
 /**
  * Tell the desktop to change the page size
- */ 
+ */
 void
 PageSizer::fire_fit_canvas_to_selection_or_drawing()
 {
     SPDesktop *dt = SP_ACTIVE_DESKTOP;
-    if (!dt)
-           return;
+    if (!dt) {
+        return;
+    }
     Verb *verb = Verb::get( SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING );
     if (verb) {
         SPAction *action = verb->get_action(dt);
         if (action)
-            sp_action_perform(action, NULL);        
+            sp_action_perform(action, NULL);
     }
 }
 
@@ -437,7 +422,7 @@ PageSizer::fire_fit_canvas_to_selection_or_drawing()
 
 /**
  * Paper Size list callback for when a user changes the selection
- */ 
+ */
 void
 PageSizer::on_paper_size_list_changed()
 {
@@ -479,37 +464,39 @@ PageSizer::on_portrait()
 {
     if (!_portraitButton.get_active())
         return;
-    double w = _dimensionWidth.getSU()->getValue ("px");
-    double h = _dimensionHeight.getSU()->getValue ("px");
-    if (h < w)
-           setDim (h, w);
+    double w = _dimensionWidth.getValue ("px");
+    double h = _dimensionHeight.getValue ("px");
+    if (h < w) {
+        setDim (h, w);
+    }
 }
 
 
 /**
  * Landscape button callback
- */ 
+ */
 void
 PageSizer::on_landscape()
 {
     if (!_landscapeButton.get_active())
         return;
-    double w = _dimensionWidth.getSU()->getValue ("px");
-    double h = _dimensionHeight.getSU()->getValue ("px");
-    if (w < h)
-           setDim (h, w);
+    double w = _dimensionWidth.getValue ("px");
+    double h = _dimensionHeight.getValue ("px");
+    if (w < h) {
+        setDim (h, w);
+    }
 }
 
 /**
  * Callback for the dimension widgets
- */ 
+ */
 void
 PageSizer::on_value_changed()
 {
     if (_widgetRegistry->isUpdating()) return;
 
-    setDim (_dimensionWidth.getSU()->getValue("px"),
-               _dimensionHeight.getSU()->getValue("px"));
+    setDim (_dimensionWidth.getValue("px"),
+            _dimensionHeight.getValue("px"));
 }