]> git.lyx.org Git - lyx.git/blob - src/frontends/gtk/GPrint.C
Add ShowFile dialog
[lyx.git] / src / frontends / gtk / GPrint.C
1 /**
2  * \file GPrint.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Huang Ying
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "GPrint.h"
14 #include "ControlPrint.h"
15 #include "ghelpers.h"
16
17 #include "PrinterParams.h"
18
19 #include "support/lstrings.h"
20 #include "support/tostr.h"
21
22 #include <libglademm.h>
23
24 using std::string;
25 using namespace lyx::support;
26
27 namespace lyx {
28 namespace frontend {
29
30 GPrint::GPrint(Dialog & parent, string const & title)
31         : GViewCB<ControlPrint, GViewGladeB>(parent, title, false)
32 {
33 }
34
35
36 void GPrint::apply()
37 {
38         PrinterParams pp;
39         pp.target = printer_->get_active() ? PrinterParams::PRINTER : PrinterParams::FILE;
40         pp.printer_name = printerEntry_->get_text();
41         pp.file_name = fileEntry_->get_text();
42         pp.all_pages = all_->get_active();
43         pp.from_page = pp.to_page = 0;
44         if (!fromEntry_->get_text().empty()) {
45                 pp.from_page = strToInt(fromEntry_->get_text());
46                 if (!toEntry_->get_text().empty())
47                         pp.to_page = strToInt(toEntry_->get_text());
48         }
49         pp.odd_pages = odd_->get_active();
50         pp.even_pages = even_->get_active();
51         pp.count_copies = number_->get_value_as_int();
52         pp.sorted_copies = sorted_->get_active();
53         pp.reverse_order = reverse_->get_active();
54         controller().params() = pp;
55 }
56
57
58 void GPrint::update()
59 {
60         PrinterParams & pp = controller().params();
61         printer_->set_active(pp.target == PrinterParams::PRINTER);
62         printerEntry_->set_text(pp.printer_name);
63         fileEntry_->set_text(pp.file_name);
64         all_->set_active(pp.all_pages);
65
66         string const from = ( pp.from_page ? tostr(pp.from_page) : string() );
67         string const to   = ( pp.to_page   ? tostr(pp.to_page)   : string() );
68         fromEntry_->set_text(from);
69         toEntry_->set_text(to);
70         odd_->set_active(pp.odd_pages);
71         even_->set_active(pp.even_pages);
72         reverse_->set_active(pp.reverse_order);
73         sorted_->set_active(pp.sorted_copies);
74         number_->set_value(pp.count_copies);
75         bool const enable_counter = pp.target == PrinterParams::PRINTER;
76         number_->set_sensitive(enable_counter);
77         sorted_->set_sensitive(enable_counter && pp.count_copies > 1);
78 }
79
80
81 void GPrint::updateUI()
82 {
83         ButtonPolicy::SMInput activate = ButtonPolicy::SMI_VALID;
84         // disable OK/Apply buttons when file output is selected, but no file name entered
85         if (file_->get_active() && fileEntry_->get_text().empty())
86                 activate = ButtonPolicy::SMI_INVALID;
87         // check 'from' and 'to' fields only when 'from/to' radio button is selected
88         if (fromTo_->get_active()) {
89                 string from = fromEntry_->get_text();
90                 string to = toEntry_->get_text();
91                 if (from.empty() || (!to.empty() && strToInt(from) > strToInt(to)))
92                         activate = ButtonPolicy::SMI_INVALID;
93         }
94         bool const enableCounter = printer_->get_active();
95         number_->set_sensitive(enableCounter);
96         bool const enableSorted = enableCounter && number_->get_value_as_int() > 1;
97         sorted_->set_sensitive(enableSorted);
98         bc().input(activate);
99 }
100
101
102 void GPrint::onBrowse()
103 {
104         string const inName = fileEntry_->get_text();
105         string const outName = Glib::locale_to_utf8(controller().browse(Glib::locale_from_utf8(inName)));
106         if (outName != inName && !outName.empty())
107                 fileEntry_->set_text(outName);
108         if (!outName.empty())
109                 file_->set_active(true);
110         updateUI();
111 }
112
113
114 void GPrint::onTargetEdit(Gtk::Entry const * who)
115 {
116         if (who == fileEntry_)
117                 file_->set_active(true);
118         else if (who == printerEntry_)
119                 printer_->set_active(true);
120         updateUI();
121 }
122
123
124 void GPrint::onFromToEdit()
125 {
126         fromTo_->set_active(true);
127         updateUI();
128 }
129
130
131 void GPrint::doBuild()
132 {
133         string const gladeName = findGladeFile("print");
134         xml_ = Gnome::Glade::Xml::create(gladeName);
135         xml_->get_widget("Printer", printer_);
136         xml_->get_widget("File", file_);
137         xml_->get_widget("All", all_);
138         xml_->get_widget("FromTo", fromTo_);
139         xml_->get_widget("Odd", odd_);
140         xml_->get_widget("Even", even_);
141         xml_->get_widget("Reverse", reverse_);
142         xml_->get_widget("Number", number_);
143         xml_->get_widget("Collate", sorted_);
144         xml_->get_widget("FromEntry", fromEntry_);
145         xml_->get_widget("ToEntry", toEntry_);
146         xml_->get_widget("PrinterEntry", printerEntry_);
147         xml_->get_widget("FileEntry", fileEntry_);
148
149         Gtk::Button * ok;
150         Gtk::Button * cancel;
151         xml_->get_widget("PrintButton", ok);
152         xml_->get_widget("CancelButton", cancel);
153
154         setOK(ok);
155         setCancel(cancel);
156
157         Gtk::Button * browse;
158         xml_->get_widget("Browse", browse);
159         browse->signal_clicked().connect(sigc::mem_fun(*this, &GPrint::onBrowse));
160
161         fileEntry_->signal_changed().connect(sigc::bind(sigc::mem_fun(*this, &GPrint::onTargetEdit), fileEntry_));
162         printerEntry_->signal_changed().connect(sigc::bind(sigc::mem_fun(*this, &GPrint::onTargetEdit), printerEntry_));
163         fromEntry_->signal_changed().connect(sigc::mem_fun(*this, &GPrint::onFromToEdit));
164         toEntry_->signal_changed().connect(sigc::mem_fun(*this, &GPrint::onFromToEdit));
165         printer_->signal_toggled().connect(sigc::mem_fun(*this, &GPrint::updateUI));
166         file_->signal_toggled().connect(sigc::mem_fun(*this, &GPrint::updateUI));
167         all_->signal_toggled().connect(sigc::mem_fun(*this, &GPrint::updateUI));
168         fromTo_->signal_toggled().connect(sigc::mem_fun(*this, &GPrint::updateUI));
169         number_->signal_changed().connect(sigc::mem_fun(*this, &GPrint::updateUI));
170
171         controller().initialiseParams("");
172         update();
173         updateUI();
174 }
175
176 } // namespace frontend
177 } // namespace lyx