1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /** \file
3  * \brief  Document Properties dialog
4  */
5 /* Authors:
6  *   Ralf Stephan <ralf@ark.in-berlin.de>
7  *   Bryce W. Harrington <bryce@bryceharrington.org>
8  *
9  * Copyright (C) 2006-2008 Johan Engelen <johan@shouraizou.nl>
10  * Copyright (C) 2004, 2005 Authors
11  *
12  * Released under GNU GPL v2+, read the file 'COPYING' for more information.
13  */
14 
15 #ifndef INKSCAPE_UI_DIALOG_DOCUMENT_PREFERENCES_H
16 #define INKSCAPE_UI_DIALOG_DOCUMENT_PREFERENCES_H
17 
18 #ifdef HAVE_CONFIG_H
19 # include "config.h"  // only include where actually required!
20 #endif
21 
22 #include <cstddef>
23 #include <gtkmm/buttonbox.h>
24 #include <gtkmm/comboboxtext.h>
25 #include <gtkmm/liststore.h>
26 #include <gtkmm/notebook.h>
27 #include <gtkmm/textview.h>
28 #include <sigc++/sigc++.h>
29 
30 #include "ui/dialog/dialog-base.h"
31 #include "ui/widget/licensor.h"
32 #include "ui/widget/page-sizer.h"
33 #include "ui/widget/registered-widget.h"
34 #include "ui/widget/registry.h"
35 #include "ui/widget/tolerance-slider.h"
36 #include "xml/helper-observer.h"
37 
38 namespace Inkscape {
39     namespace XML {
40         class Node;
41     }
42     namespace UI {
43         namespace Widget {
44             class EntityEntry;
45             class NotebookPage;
46         }
47         namespace Dialog {
48 
49 typedef std::list<UI::Widget::EntityEntry*> RDElist;
50 
51 class DocumentProperties : public DialogBase
52 {
53 public:
54     void  update_widgets();
55     static DocumentProperties &getInstance();
56     static void destroy();
57 
58     void update() override;
59 
60     void  update_gridspage();
61 
62 protected:
63     void  build_page();
64     void  build_grid();
65     void  build_guides();
66     void  build_snap();
67     void  build_gridspage();
68 
69     void  create_guides_around_page();
70     void  delete_all_guides();
71     void  build_cms();
72     void  build_scripting();
73     void  build_metadata();
74     void  init();
75 
76     virtual void  on_response (int);
77     void  populate_available_profiles();
78     void  populate_linked_profiles_box();
79     void  linkSelectedProfile();
80     void  removeSelectedProfile();
81     void  onColorProfileSelectRow();
82     void  linked_profiles_list_button_release(GdkEventButton* event);
83     void  cms_create_popup_menu(Gtk::Widget& parent, sigc::slot<void> rem);
84 
85     void  external_scripts_list_button_release(GdkEventButton* event);
86     void  embedded_scripts_list_button_release(GdkEventButton* event);
87     void  populate_script_lists();
88     void  addExternalScript();
89     void  browseExternalScript();
90     void  addEmbeddedScript();
91     void  removeExternalScript();
92     void  removeEmbeddedScript();
93     void  changeEmbeddedScript();
94     void  onExternalScriptSelectRow();
95     void  onEmbeddedScriptSelectRow();
96     void  editEmbeddedScript();
97     void  external_create_popup_menu(Gtk::Widget& parent, sigc::slot<void> rem);
98     void  embedded_create_popup_menu(Gtk::Widget& parent, sigc::slot<void> rem);
99     void  load_default_metadata();
100     void  save_default_metadata();
101 
102     Inkscape::XML::SignalObserver _emb_profiles_observer, _scripts_observer;
103     Gtk::Notebook  _notebook;
104 
105     UI::Widget::NotebookPage   *_page_page;
106     UI::Widget::NotebookPage   *_page_guides;
107     UI::Widget::NotebookPage   *_page_snap;
108     UI::Widget::NotebookPage   *_page_cms;
109     UI::Widget::NotebookPage   *_page_scripting;
110 
111     Gtk::Notebook _scripting_notebook;
112     UI::Widget::NotebookPage *_page_external_scripts;
113     UI::Widget::NotebookPage *_page_embedded_scripts;
114 
115     UI::Widget::NotebookPage  *_page_metadata1;
116     UI::Widget::NotebookPage  *_page_metadata2;
117 
118     Gtk::Box      _grids_vbox;
119 
120     UI::Widget::Registry _wr;
121     //---------------------------------------------------------------
122     Gtk::Grid            _rcb_doc_props_left;
123     Gtk::Grid            _rcb_doc_props_right;
124     UI::Widget::RegisteredCheckButton _rcb_antialias;
125     UI::Widget::RegisteredCheckButton _rcb_checkerboard;
126     UI::Widget::RegisteredCheckButton _rcb_canb;
127     UI::Widget::RegisteredCheckButton _rcb_bord;
128     UI::Widget::RegisteredCheckButton _rcb_shad;
129     UI::Widget::RegisteredColorPicker _rcp_bg;
130     UI::Widget::RegisteredColorPicker _rcp_bord;
131     UI::Widget::RegisteredUnitMenu    _rum_deflt;
132     UI::Widget::PageSizer             _page_sizer;
133     //---------------------------------------------------------------
134     UI::Widget::RegisteredCheckButton _rcb_sgui;
135     UI::Widget::RegisteredCheckButton _rcb_lgui;
136     UI::Widget::RegisteredColorPicker _rcp_gui;
137     UI::Widget::RegisteredColorPicker _rcp_hgui;
138     Gtk::Button                       _create_guides_btn;
139     Gtk::Button                       _delete_guides_btn;
140     //---------------------------------------------------------------
141     UI::Widget::ToleranceSlider       _rsu_sno;
142     UI::Widget::ToleranceSlider       _rsu_sn;
143     UI::Widget::ToleranceSlider       _rsu_gusn;
144     UI::Widget::RegisteredCheckButton _rcb_snclp;
145     UI::Widget::RegisteredCheckButton _rcb_snmsk;
146     UI::Widget::RegisteredCheckButton _rcb_perp;
147     UI::Widget::RegisteredCheckButton _rcb_tang;
148     //---------------------------------------------------------------
149     Gtk::Button         _unlink_btn;
150     class AvailableProfilesColumns : public Gtk::TreeModel::ColumnRecord
151         {
152         public:
AvailableProfilesColumns()153             AvailableProfilesColumns()
154               { add(fileColumn); add(nameColumn); add(separatorColumn); }
155             Gtk::TreeModelColumn<Glib::ustring> fileColumn;
156             Gtk::TreeModelColumn<Glib::ustring> nameColumn;
157             Gtk::TreeModelColumn<bool> separatorColumn;
158         };
159     AvailableProfilesColumns _AvailableProfilesListColumns;
160     Glib::RefPtr<Gtk::ListStore> _AvailableProfilesListStore;
161     Gtk::ComboBox _AvailableProfilesList;
162     bool _AvailableProfilesList_separator(const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::iterator& iter);
163     class LinkedProfilesColumns : public Gtk::TreeModel::ColumnRecord
164         {
165         public:
LinkedProfilesColumns()166             LinkedProfilesColumns()
167               { add(nameColumn); add(previewColumn); }
168             Gtk::TreeModelColumn<Glib::ustring> nameColumn;
169             Gtk::TreeModelColumn<Glib::ustring> previewColumn;
170         };
171     LinkedProfilesColumns _LinkedProfilesListColumns;
172     Glib::RefPtr<Gtk::ListStore> _LinkedProfilesListStore;
173     Gtk::TreeView _LinkedProfilesList;
174     Gtk::ScrolledWindow _LinkedProfilesListScroller;
175     Gtk::Menu _EmbProfContextMenu;
176 
177     //---------------------------------------------------------------
178     Gtk::Button         _external_add_btn;
179     Gtk::Button         _external_remove_btn;
180     Gtk::Button         _embed_new_btn;
181     Gtk::Button         _embed_remove_btn;
182     Gtk::ButtonBox      _embed_button_box;
183 
184     class ExternalScriptsColumns : public Gtk::TreeModel::ColumnRecord
185         {
186         public:
ExternalScriptsColumns()187             ExternalScriptsColumns()
188                { add(filenameColumn); }
189             Gtk::TreeModelColumn<Glib::ustring> filenameColumn;
190         };
191     ExternalScriptsColumns _ExternalScriptsListColumns;
192     class EmbeddedScriptsColumns : public Gtk::TreeModel::ColumnRecord
193         {
194         public:
EmbeddedScriptsColumns()195             EmbeddedScriptsColumns()
196                { add(idColumn); }
197             Gtk::TreeModelColumn<Glib::ustring> idColumn;
198         };
199     EmbeddedScriptsColumns _EmbeddedScriptsListColumns;
200     Glib::RefPtr<Gtk::ListStore> _ExternalScriptsListStore;
201     Glib::RefPtr<Gtk::ListStore> _EmbeddedScriptsListStore;
202     Gtk::TreeView _ExternalScriptsList;
203     Gtk::TreeView _EmbeddedScriptsList;
204     Gtk::ScrolledWindow _ExternalScriptsListScroller;
205     Gtk::ScrolledWindow _EmbeddedScriptsListScroller;
206     Gtk::Menu _ExternalScriptsContextMenu;
207     Gtk::Menu _EmbeddedScriptsContextMenu;
208     Gtk::Entry _script_entry;
209     Gtk::TextView _EmbeddedContent;
210     Gtk::ScrolledWindow _EmbeddedContentScroller;
211     //---------------------------------------------------------------
212 
213     Gtk::Notebook   _grids_notebook;
214     Gtk::Box        _grids_hbox_crea;
215     Gtk::Label      _grids_label_crea;
216     Gtk::Button     _grids_button_new;
217     Gtk::Button     _grids_button_remove;
218     Gtk::ComboBoxText _grids_combo_gridtype;
219     Gtk::Label      _grids_label_def;
220     Gtk::Box        _grids_space;
221     //---------------------------------------------------------------
222 
223     RDElist _rdflist;
224     UI::Widget::Licensor _licensor;
225 
226     Gtk::Box& _createPageTabLabel(const Glib::ustring& label, const char *label_image);
227 
228 private:
229     DocumentProperties();
230     ~DocumentProperties() override;
231 
232     // callback methods for buttons on grids page.
233     void onNewGrid();
234     void onRemoveGrid();
235 
236     // callback for document unit change
237     void onDocUnitChange();
238 
239     // nodes connected to listeners
240     Inkscape::XML::Node *_repr_namedview = nullptr;
241     Inkscape::XML::Node *_repr_root = nullptr;
242 
243     sigc::connection _document_replaced_connection;
244 };
245 
246 } // namespace Dialog
247 } // namespace UI
248 } // namespace Inkscape
249 
250 #endif // INKSCAPE_UI_DIALOG_DOCUMENT_PREFERENCES_H
251 
252 /*
253   Local Variables:
254   mode:c++
255   c-file-style:"stroustrup"
256   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
257   indent-tabs-mode:nil
258   fill-column:99
259   End:
260 */
261 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
262