Code

09dfcf1c0a58401b83fb1fcded8d56d92f9015d6
[inkscape.git] / src / ui / widget / page-sizer.h
1 /** \file
2  * \brief Widget for specifying page size; part of Document Preferences dialog.
3  *
4  * Author:
5  *   Ralf Stephan <ralf@ark.in-berlin.de>
6  *
7  * Copyright (C) 2005-2006 Authors
8  *
9  * Released under GNU GPL.  Read the file 'COPYING' for more information.
10  */
12 #ifndef INKSCAPE_UI_WIDGET_PAGE_SIZER__H
13 #define INKSCAPE_UI_WIDGET_PAGE_SIZER__H
15 #include <gtkmm.h>
16 #include <sigc++/sigc++.h>
17 #include "ui/widget/registry.h"
18 #include "ui/widget/registered-widget.h"
19 #include "helper/units.h"
22 namespace Inkscape {    
23 namespace UI {
24 namespace Widget {
26 /**
27  * Data class used to store common paper dimensions.  Used to make
28  * PageSizer's _paperSizeTable. 
29  */ 
30 class PaperSize
31 {
32 public:
34     /**
35      * Default constructor
36      */
37     PaperSize()
38         { init(); }
40     /**
41      * Main constructor.  Use this one.
42      */
43     PaperSize(const Glib::ustring &nameArg,
44                   double smallerArg,
45                   double largerArg,
46                           SPUnitId unitArg)
47             {
48             name    = nameArg;
49             smaller = smallerArg;
50             larger  = largerArg;
51             unit    = unitArg;
52             }
54     /**
55      * Copy constructor
56      */
57     PaperSize(const PaperSize &other)
58         { assign(other); }
59         
60     /**
61      * Assignment operator
62      */      
63     PaperSize &operator=(const PaperSize &other)
64         { assign(other); return *this; }
66     /**
67      * Destructor
68      */      
69         virtual ~PaperSize()
70             {}
71             
72     /**
73      * Name of this paper specification
74      */      
75     Glib::ustring name;
76     
77     /**
78      * The lesser of the two dimensions
79      */      
80     double smaller;
81     
82     /**
83      * The greater of the two dimensions
84      */      
85     double larger;
86     
87     /**
88      * The units (px, pt, mm, etc) of this specification
89      */      
90     SPUnitId unit;
92 private:
94         void init()
95             {
96             name    = "";
97             smaller = 0.0;
98             larger  = 0.0;
99             unit    = SP_UNIT_PX;
100             }
102         void assign(const PaperSize &other)
103             {
104             name    = other.name;
105             smaller = other.smaller;
106             larger  = other.larger;
107             unit    = other.unit;
108         }
110 };
116 /**
117  * A compound widget that allows the user to select the desired
118  * page size.  This widget is used in DocumentPreferences 
119  */ 
120 class PageSizer : public Gtk::VBox
122 public:
124     /**
125      * Constructor
126      */
127     PageSizer();
129     /**
130      * Destructor
131      */
132     virtual ~PageSizer();
134     /**
135      * Set up or reset this widget
136      */      
137     void init (Registry& reg);
138     
139     /**
140      * Set the page size to the given dimensions.  If 'changeList' is
141      * true, then reset the paper size list to the closest match
142      */
143     void setDim (double w, double h, bool changeList=true);
144  
145 protected:
147     /**
148      * Our handy table of all 'standard' paper sizes.
149      */      
150     std::map<Glib::ustring, PaperSize> _paperSizeTable;
152     /**
153      *  Find the closest standard paper size in the table, to the
154      */
155     int find_paper_size (double w, double h) const;
156  
157     void fire_fit_canvas_to_selection_or_drawing();
158     
159     //### Dimension spinboxes
160     RegisteredUnitMenu   _dimensionUnits;
161     RegisteredScalarUnit _dimensionWidth;
162         RegisteredScalarUnit _dimensionHeight;
163     //callback
164     void on_value_changed();
165     sigc::connection    _changedw_connection;
166         sigc::connection    _changedh_connection;
167     
168     //### The Paper Size selection list
169     class PaperSizeColumns : public Gtk::TreeModel::ColumnRecord
170         {
171         public:
172             PaperSizeColumns()
173                { add(nameColumn); add(descColumn);  }
174             Gtk::TreeModelColumn<Glib::ustring> nameColumn;
175             Gtk::TreeModelColumn<Glib::ustring> descColumn;
176         };
178     PaperSizeColumns _paperSizeColumns;
179     Glib::RefPtr<Gtk::ListStore> _paperSizeListStore;
180     Gtk::TreeView _paperSizeList;
181     Glib::RefPtr<Gtk::TreeSelection> _paperSizeListSelection;
182     Gtk::ScrolledWindow  _paperSizeListScroller;
183     //callback
184     void on_paper_size_list_changed();
185     sigc::connection    _paper_size_list_connection;
186     
187     //### Button to select 'portrait' orientation
188     Gtk::RadioButton    _portraitButton;
189     //callback
190     void on_portrait();
191     sigc::connection    _portrait_connection;
193     //### Button to select 'landscape' orientation
194         Gtk::RadioButton    _landscapeButton;
195         //callback
196     void on_landscape();
197         sigc::connection    _landscape_connection;
199     Registry            *_widgetRegistry;
201     //### state - whether we are currently landscape or portrait
202     bool                 _landscape;
204 };
206 } // namespace Widget
207 } // namespace UI
208 } // namespace Inkscape
211 #endif /* INKSCAPE_UI_WIDGET_PAGE_SIZER__H */
213 /*
214   Local Variables:
215   mode:c++
216   c-file-style:"stroustrup"
217   c-file-offsets:((innamespace . 0)(inline-open . 0))
218   indent-tabs-mode:nil
219   fill-column:99
220   End:
221 */
222 // vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :