3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * \author Angus Leeming
10 * Full author contact details are available in file CREDITS.
17 #include "qt_helpers.h"
18 #include "PrinterParams.h"
20 #include "frontend_helpers.h"
23 #include "BufferParams.h"
24 #include "FuncRequest.h"
27 #include "support/convert.h"
28 #include "support/FileFilterList.h"
29 #include "support/filetools.h"
30 #include "support/os.h"
34 #include <QRadioButton>
36 #include <QPushButton>
44 using support::FileFilterList;
47 GuiPrint::GuiPrint(LyXView & lv)
48 : GuiDialog(lv, "print"), Controller(this)
51 setController(this, false);
52 setViewTitle(_("Print Document"));
54 connect(printPB, SIGNAL(clicked()), this, SLOT(slotOK()));
55 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
57 connect(copiesSB, SIGNAL(valueChanged(int)), this, SLOT(copiesChanged(int)));
58 connect(printerED, SIGNAL(textChanged(QString)),
59 this, SLOT(printerChanged()));
60 connect(fileED, SIGNAL(textChanged(QString)),
61 this, SLOT(fileChanged() ));
62 connect(browsePB, SIGNAL(clicked()), this, SLOT(browseClicked()));
63 connect(allRB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
64 connect(reverseCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
65 connect(collateCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
66 connect(fromED, SIGNAL(textChanged(const QString&)),
67 this, SLOT(pagerangeChanged()));
68 connect(fromED, SIGNAL(textChanged(const QString&)),
69 this, SLOT(change_adaptor()));
70 connect(toED, SIGNAL(textChanged(const QString&)),
71 this, SLOT(pagerangeChanged()));
72 connect(toED, SIGNAL(textChanged(const QString&)),
73 this, SLOT(change_adaptor()));
74 connect(fileRB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
75 connect(printerRB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
76 connect(rangeRB, SIGNAL(toggled(bool)), fromED, SLOT(setEnabled(bool)));
77 connect(rangeRB, SIGNAL(toggled(bool)), toED, SLOT(setEnabled(bool)));
79 bc().setPolicy(ButtonPolicy::OkApplyCancelPolicy);
81 bc().setCancel(closePB);
85 void GuiPrint::change_adaptor()
91 void GuiPrint::browseClicked()
94 browseRelFile(docstring(), from_utf8(buffer().filePath()),
96 FileFilterList(_("PostScript files (*.ps)")),
98 QString file = toqstr(name);
100 fileED->setText(file);
106 void GuiPrint::fileChanged()
108 if (!fileED->text().isEmpty())
109 fileRB->setChecked(true);
114 void GuiPrint::copiesChanged(int i)
116 collateCB->setEnabled(i != 1);
121 void GuiPrint::printerChanged()
123 printerRB->setChecked(true);
128 void GuiPrint::pagerangeChanged()
134 void GuiPrint::updateContents()
136 // only reset params if a different buffer
137 if (!params_.file_name.empty()
138 && params_.file_name == fromqstr(fileED->text()))
141 printerED->setText(toqstr(params_.printer_name));
142 fileED->setText(toqstr(params_.file_name));
144 printerRB->setChecked(true);
145 if (params_.target == PrinterParams::FILE)
146 fileRB->setChecked(true);
148 reverseCB->setChecked(params_.reverse_order);
150 copiesSB->setValue(params_.count_copies);
152 oddCB->setChecked(params_.odd_pages);
153 evenCB->setChecked(params_.even_pages);
155 collateCB->setChecked(params_.sorted_copies);
157 if (params_.all_pages) {
158 allRB->setChecked(true);
160 rangeRB->setChecked(true);
161 fromED->setText(QString::number(params_.from_page));
162 toED->setText(QString::number(params_.to_page));
167 void GuiPrint::applyView()
169 PrinterParams::Target t = PrinterParams::PRINTER;
170 if (fileRB->isChecked())
171 t = PrinterParams::FILE;
173 params_ = PrinterParams(t,
174 fromqstr(printerED->text()),
175 support::os::internal_path(fromqstr(fileED->text())),
177 fromED->text().toUInt(),
178 toED->text().toUInt(),
181 copiesSB->text().toUInt(),
182 collateCB->isChecked(),
183 reverseCB->isChecked()
188 bool GuiPrint::initialiseParams(std::string const &)
190 /// get global printer parameters
191 string const name = support::changeExtension(buffer().fileName(),
192 lyxrc.print_file_extension);
193 params_ = PrinterParams(PrinterParams::PRINTER, lyxrc.printer, name);
195 dialog().setButtonsValid(true); // so that the user can press Ok
200 void GuiPrint::clearParams()
202 params_ = PrinterParams();
206 /// print the current buffer
207 void GuiPrint::dispatchParams()
209 string command = lyxrc.print_command + ' ';
211 if (params_.target == PrinterParams::PRINTER
212 && lyxrc.print_adapt_output // dvips wants a printer name
213 && !params_.printer_name.empty()) {// printer name given
214 command += lyxrc.print_to_printer + params_.printer_name + ' ';
217 if (!params_.all_pages && params_.from_page) {
218 command += lyxrc.print_pagerange_flag + ' ';
219 command += convert<string>(params_.from_page);
220 if (params_.to_page) {
221 // we have a range "from-to"
222 command += '-' + convert<string>(params_.to_page);
227 // If both are, or both are not selected, then skip the odd/even printing
228 if (params_.odd_pages != params_.even_pages) {
229 if (params_.odd_pages)
230 command += lyxrc.print_oddpage_flag + ' ';
231 else if (params_.even_pages)
232 command += lyxrc.print_evenpage_flag + ' ';
235 if (params_.count_copies > 1) {
236 if (params_.sorted_copies)
237 command += lyxrc.print_collcopies_flag;
239 command += lyxrc.print_copies_flag;
240 command += ' ' + convert<string>(params_.count_copies) + ' ';
243 if (params_.reverse_order)
244 command += lyxrc.print_reverse_flag + ' ';
246 if (!lyxrc.print_extra_options.empty())
247 command += lyxrc.print_extra_options + ' ';
249 command += buffer().params().dvips_options();
251 string const target = (params_.target == PrinterParams::PRINTER) ?
254 string const target_name = (params_.target == PrinterParams::PRINTER) ?
255 (params_.printer_name.empty() ? "default" : params_.printer_name) :
258 string const data = target + " \"" + target_name + "\" \"" + command + '"';
259 dispatch(FuncRequest(getLfun(), data));
263 Dialog * createGuiPrint(LyXView & lv) { return new GuiPrint(lv); }
266 } // namespace frontend
269 #include "GuiPrint_moc.cpp"