X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiSendto.cpp;h=3eff7f4cc37ba7bc66ad7164b86e35e07fe70aca;hb=737e9b2c20b9aa14c91330c83ace13c632c6c816;hp=c466505710d0aa529fe5b85fc86aa1209fa65e9e;hpb=9a95d2a936748c057db94a3083c4b9e6587eea0b;p=lyx.git diff --git a/src/frontends/qt4/GuiSendto.cpp b/src/frontends/qt4/GuiSendto.cpp index c466505710..3eff7f4cc3 100644 --- a/src/frontends/qt4/GuiSendto.cpp +++ b/src/frontends/qt4/GuiSendto.cpp @@ -3,7 +3,8 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Jürgen Spitzmüller + * \author Angus Leeming + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -13,88 +14,70 @@ #include "GuiSendto.h" #include "qt_helpers.h" +#include "Buffer.h" +#include "BufferParams.h" +#include "Converter.h" #include "Format.h" +#include "FuncRequest.h" +#include "LyXRC.h" +#include "support/qstring_helpers.h" +#include "support/filetools.h" + +#include #include #include -#include - -using std::vector; -using std::string; +using namespace std; +using namespace lyx::support; namespace lyx { namespace frontend { -///////////////////////////////////////////////////////////////////// -// -// GuiSendtoDialog -// -///////////////////////////////////////////////////////////////////// -GuiSendtoDialog::GuiSendtoDialog(GuiSendto * form) - : form_(form) +GuiSendTo::GuiSendTo(GuiView & lv) + : GuiDialog(lv, "sendto", qt_("Send Document to Command")) { setupUi(this); - connect(okPB, SIGNAL(clicked()), - form, SLOT(slotOK())); - connect(applyPB, SIGNAL(clicked()), - form, SLOT(slotApply())); - connect(closePB, SIGNAL(clicked()), - form, SLOT(slotClose())); - - connect( formatLW, SIGNAL( itemClicked(QListWidgetItem *) ), - this, SLOT( slotFormatHighlighted(QListWidgetItem *) ) ); - connect( formatLW, SIGNAL( itemActivated(QListWidgetItem *) ), - this, SLOT( slotFormatSelected(QListWidgetItem *) ) ); - connect( formatLW, SIGNAL( itemClicked(QListWidgetItem *) ), - this, SLOT( changed_adaptor() ) ); - connect( commandCO, SIGNAL( textChanged(const QString&) ), - this, SLOT( changed_adaptor() ) ); -} - - -void GuiSendtoDialog::changed_adaptor() -{ - form_->changed(); + connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK())); + connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply())); + connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose())); + + connect(formatLW, SIGNAL(itemClicked(QListWidgetItem *)), + this, SLOT(slotFormatHighlighted(QListWidgetItem *))); + connect(formatLW, SIGNAL(itemActivated(QListWidgetItem *)), + this, SLOT(slotFormatSelected(QListWidgetItem *))); + connect(formatLW, SIGNAL(itemClicked(QListWidgetItem *)), + this, SLOT(changed_adaptor())); + connect(formatLW, SIGNAL(itemSelectionChanged()), + this, SLOT(changed_adaptor())); + connect(commandCO, SIGNAL(textChanged(QString)), + this, SLOT(changed_adaptor())); + + bc().setPolicy(ButtonPolicy::OkApplyCancelPolicy); + bc().setOK(okPB); + bc().setApply(applyPB); + bc().setCancel(closePB); } -void GuiSendtoDialog::closeEvent(QCloseEvent * e) -{ - form_->slotWMHide(); - e->accept(); -} - - -///////////////////////////////////////////////////////////////////// -// -// GuiSendto -// -///////////////////////////////////////////////////////////////////// - - -GuiSendto::GuiSendto(GuiDialog & parent) - : GuiView(parent, _("Send Document to Command")) +void GuiSendTo::changed_adaptor() { + changed(); } -void GuiSendto::build_dialog() +void GuiSendTo::updateContents() { - dialog_.reset(new GuiSendtoDialog(this)); - - // Manage the ok, apply, restore and cancel/close buttons - bc().setOK(dialog_->okPB); - bc().setApply(dialog_->applyPB); - bc().setCancel(dialog_->closePB); -} + all_formats_ = allFormats(); - -void GuiSendto::update_contents() -{ - all_formats_ = controller().allFormats(); + // Save the current selection if any + Format const * current_format = 0; + int const line = formatLW->currentRow(); + if (line >= 0 && line <= formatLW->count() + && formatLW->selectedItems().size() > 0) + current_format = all_formats_[line]; // Check whether the current contents of the browser will be // changed by loading the contents of formats @@ -104,48 +87,142 @@ void GuiSendto::update_contents() vector::iterator result = keys.begin(); vector::const_iterator it = all_formats_.begin(); vector::const_iterator end = all_formats_.end(); - for (; it != end; ++it, ++result) { + + int current_line = -1; + for (int ln = 0; it != end; ++it, ++result, ++ln) { *result = (*it)->prettyname(); + if (current_format + && (*it)->prettyname() == current_format->prettyname()) + current_line = ln; } // Reload the browser - dialog_->formatLW->clear(); + formatLW->clear(); for (vector::const_iterator it = keys.begin(); - it < keys.end(); ++it) { - dialog_->formatLW->addItem(toqstr(*it)); + it != keys.end(); ++it) { + formatLW->addItem(qt_(*it)); } - dialog_->commandCO->addItem(toqstr(controller().getCommand())); + // Restore the selection + if (current_line > -1) + formatLW->setCurrentItem(formatLW->item(current_line)); } -void GuiSendto::applyView() +void GuiSendTo::applyView() { - int const line(dialog_->formatLW->currentRow()); + int const line = formatLW->currentRow(); + QString const command = commandCO->currentText().trimmed(); - if (line < 0 || line > int(dialog_->formatLW->count())) - return; + if (commandCO->findText(command) == -1) + commandCO->insertItem(0, command); - string const cmd(fromqstr(dialog_->commandCO->currentText())); + if (line < 0 || line > formatLW->count()) + return; - controller().setFormat(all_formats_[line]); - controller().setCommand(cmd); + format_ = all_formats_[line]; + command_ = command; } -bool GuiSendto::isValid() +bool GuiSendTo::isValid() { - int const line(dialog_->formatLW->currentRow()); + int const line = formatLW->currentRow(); - if (line < 0 || line > int(dialog_->formatLW->count())) + if (line < 0 || line > int(formatLW->count())) return false; - else return dialog_->formatLW->count() != 0 && - !dialog_->commandCO->currentText().isEmpty(); + return (formatLW->selectedItems().size() > 0 + && formatLW->count() != 0 + && !commandCO->currentText().isEmpty()); +} + + +bool GuiSendTo::initialiseParams(string const &) +{ + format_ = 0; + command_ = toqstr(lyxrc.custom_export_command); + paramsToDialog(format_, command_); + return true; +} + + +void GuiSendTo::paramsToDialog(Format const * /*format*/, QString const & command) +{ + if (!command.isEmpty()) + commandCO->addItem(command); + + bc().setValid(isValid()); +} + + +void GuiSendTo::dispatchParams() +{ + if (command_.isEmpty() || !format_ || format_->name().empty()) + return; + + string const data = format_->name() + " " + fromqstr(command_); + dispatch(FuncRequest(getLfun(), data)); } +// FIXME: Move to Converters? +vector GuiSendTo::allFormats() const +{ + // What formats can we output natively? + vector exports; + exports.push_back("lyx"); + exports.push_back("text"); + + if (buffer().isLatex()) { + if (buffer().params().useXetex) + exports.push_back("xetex"); + else { + exports.push_back("latex"); + exports.push_back("pdflatex"); + } + } + else if (buffer().isDocBook()) + exports.push_back("docbook"); + else if (buffer().isLiterate()) + exports.push_back("literate"); + + // Loop over these native formats and ascertain what formats we + // can convert to + vector to; + + vector::const_iterator ex_it = exports.begin(); + vector::const_iterator ex_end = exports.end(); + for (; ex_it != ex_end; ++ex_it) { + // Start off with the native export format. + // "formats" is LyX's list of recognised formats + to.push_back(formats.getFormat(*ex_it)); + + Formats::const_iterator fo_it = formats.begin(); + Formats::const_iterator fo_end = formats.end(); + for (; fo_it != fo_end; ++fo_it) { + // we need to hide the default graphic export formats + // from the external menu, because we need them only + // for the internal lyx-view and external latex run + string const name = fo_it->name(); + if (name != "eps" && name != "xpm" && name != "png" && + theConverters().isReachable(*ex_it, name)) + to.push_back(&(*fo_it)); + } + } + + // Remove repeated formats. + sort(to.begin(), to.end()); + to.erase(unique(to.begin(), to.end()), to.end()); + + return to; +} + + +Dialog * createGuiSendTo(GuiView & lv) { return new GuiSendTo(lv); } + + } // namespace frontend } // namespace lyx -#include "GuiSendto_moc.cpp" +#include "moc_GuiSendto.cpp"