3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include <libglademm.h>
16 #include "ControlPrint.h"
17 #include "support/filetools.h"
18 #include "PrinterParams.h"
19 #include "support/lstrings.h"
22 GPrint::GPrint(Dialog & parent, string title)
23 : GViewCB<ControlPrint, GViewGladeB>(parent, title, false)
31 pp.target = printer_->get_active() ? PrinterParams::PRINTER : PrinterParams::FILE;
32 pp.printer_name = printerEntry_->get_text();
33 pp.file_name = printerEntry_->get_text();
34 pp.all_pages = all_->get_active();
35 pp.from_page = pp.to_page = 0;
36 if (!fromEntry_->get_text().empty()) {
37 pp.from_page = strToInt(fromEntry_->get_text());
38 if (!toEntry_->get_text().empty())
39 pp.to_page = strToInt(toEntry_->get_text());
41 pp.odd_pages = odd_->get_active();
42 pp.even_pages = even_->get_active();
43 pp.count_copies = number_->get_value_as_int();
44 pp.sorted_copies = sorted_->get_active();
45 pp.reverse_order = reverse_->get_active();
46 controller().params() = pp;
52 PrinterParams & pp = controller().params();
53 printer_->set_active(pp.target == PrinterParams::PRINTER);
54 printerEntry_->set_text(pp.printer_name);
55 fileEntry_->set_text(pp.file_name);
56 all_->set_active(pp.all_pages);
58 string const from = ( pp.from_page ? tostr(pp.from_page) : string() );
59 string const to = ( pp.to_page ? tostr(pp.to_page) : string() );
60 fromEntry_->set_text(from);
61 toEntry_->set_text(to);
62 odd_->set_active(pp.odd_pages);
63 even_->set_active(pp.even_pages);
64 reverse_->set_active(pp.reverse_order);
65 sorted_->set_active(pp.sorted_copies);
66 number_->set_value(pp.count_copies);
67 bool const enable_counter = pp.target == PrinterParams::PRINTER;
68 number_->set_sensitive(enable_counter);
69 sorted_->set_sensitive(enable_counter && pp.count_copies > 1);
73 void GPrint::updateUI()
75 ButtonPolicy::SMInput activate = ButtonPolicy::SMI_VALID;
76 // disable OK/Apply buttons when file output is selected, but no file name entered
77 if (file_->get_active() && fileEntry_->get_text().empty())
78 activate = ButtonPolicy::SMI_INVALID;
79 // check 'from' and 'to' fields only when 'from/to' radio button is selected
80 if (fromTo_->get_active()) {
81 string from = fromEntry_->get_text();
82 string to = toEntry_->get_text();
83 if (from.empty() || (!to.empty() && strToInt(from) > strToInt(to)))
84 activate = ButtonPolicy::SMI_INVALID;
86 bool const enableCounter = printer_->get_active();
87 number_->set_sensitive(enableCounter);
88 bool const enableSorted = enableCounter && number_->get_value_as_int() > 1;
89 sorted_->set_sensitive(enableSorted);
94 void GPrint::onBrowse()
96 string const inName = fileEntry_->get_text();
97 string const outName = Glib::locale_to_utf8(controller().Browse(Glib::locale_from_utf8(inName)));
98 if (outName != inName && !outName.empty())
99 fileEntry_->set_text(outName);
100 if (!outName.empty())
101 file_->set_active(true);
106 void GPrint::onTargetEdit(Gtk::Entry const * who)
108 if (who == fileEntry_)
109 file_->set_active(true);
110 else if (who == printerEntry_)
111 printer_->set_active(true);
116 void GPrint::onFromToEdit()
118 fromTo_->set_active(true);
123 void GPrint::doBuild()
125 string const gladeName = LibFileSearch("glade", "print", "glade");
126 xml_ = Gnome::Glade::Xml::create(gladeName);
127 xml_->get_widget("Printer", printer_);
128 xml_->get_widget("File", file_);
129 xml_->get_widget("All", all_);
130 xml_->get_widget("FromTo", fromTo_);
131 xml_->get_widget("Odd", odd_);
132 xml_->get_widget("Even", even_);
133 xml_->get_widget("Reverse", reverse_);
134 xml_->get_widget("Number", number_);
135 xml_->get_widget("Sorted", sorted_);
136 xml_->get_widget("FromEntry", fromEntry_);
137 xml_->get_widget("ToEntry", toEntry_);
138 xml_->get_widget("PrinterEntry", printerEntry_);
139 xml_->get_widget("FileEntry", fileEntry_);
141 Gtk::Button * cancel;
143 xml_->get_widget("OkButton", ok);
144 xml_->get_widget("CancelButton", cancel);
145 xml_->get_widget("ApplyButton", apply);
147 bc().setApply(apply);
148 bc().setCancel(cancel);
149 ok->signal_clicked().connect(SigC::slot(*this, &GViewBase::onOK));
150 apply->signal_clicked().connect(SigC::slot(*this, &GViewBase::onApply));
151 cancel->signal_clicked().connect(SigC::slot(*this, &GViewBase::onCancel));
152 Gtk::Button * browse;
153 xml_->get_widget("Browse", browse);
154 browse->signal_clicked().connect(SigC::slot(*this, &GPrint::onBrowse));
155 fileEntry_->signal_changed().connect(SigC::bind(SigC::slot(*this, &GPrint::onTargetEdit), fileEntry_));
156 printerEntry_->signal_changed().connect(SigC::bind(SigC::slot(*this, &GPrint::onTargetEdit), printerEntry_));
157 fromEntry_->signal_changed().connect(SigC::slot(*this, &GPrint::onFromToEdit));
158 toEntry_->signal_changed().connect(SigC::slot(*this, &GPrint::onFromToEdit));
159 printer_->signal_toggled().connect(SigC::slot(*this, &GPrint::updateUI));
160 file_->signal_toggled().connect(SigC::slot(*this, &GPrint::updateUI));
161 all_->signal_toggled().connect(SigC::slot(*this, &GPrint::updateUI));
162 fromTo_->signal_toggled().connect(SigC::slot(*this, &GPrint::updateUI));
163 number_->signal_changed().connect(SigC::slot(*this, &GPrint::updateUI));