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