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