]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiDocument.cpp
Embedding: merge lyx::EmbeddedFiles to lyx::support::EmbeddedFileList
[lyx.git] / src / frontends / qt4 / GuiDocument.cpp
index 26038d73712b52843e367a23f9e191a73aaac1bf..ad08b559da5eba1e1d41cb055cb9024436fd0d11 100644 (file)
 #include "BufferParams.h"
 #include "BufferView.h"
 #include "Color.h"
+#include "EmbeddedFiles.h"
 #include "Encoding.h"
 #include "FloatPlacement.h"
-#include "frontend_helpers.h"
 #include "FuncRequest.h"
-#include "gettext.h"
+#include "support/gettext.h"
 #include "GuiBranches.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
 #include "TextClassList.h"
 #include "Validator.h"
 
-
-// FIXME: those two headers are needed because of the
-// WorkArea::redraw() call below.
-#include "frontends/LyXView.h"
-#include "frontends/WorkArea.h"
-
 #include "insets/InsetListingsParams.h"
 
+#include "support/FileName.h"
+#include "support/filetools.h"
 #include "support/lstrings.h"
 
 #include <boost/bind.hpp>
 #include <algorithm>
 #include <sstream>
 
-using std::distance;
-using std::make_pair;
-using std::pair;
-using std::vector;
-using std::string;
-using std::ostringstream;
-using std::sort;
+using namespace std;
+using namespace lyx::support;
 
 ///
 template<class Pair>
-std::vector<typename Pair::second_type> const
-getSecond(std::vector<Pair> const & pr)
+vector<typename Pair::second_type> const
+getSecond(vector<Pair> const & pr)
 {
-        std::vector<typename Pair::second_type> tmp(pr.size());
-        std::transform(pr.begin(), pr.end(), tmp.begin(),
+        vector<typename Pair::second_type> tmp(pr.size());
+        transform(pr.begin(), pr.end(), tmp.begin(),
                                         boost::bind(&Pair::second, _1));
         return tmp;
 }
@@ -143,11 +134,6 @@ vector<pair<string, lyx::docstring> > pagestyles;
 namespace lyx {
 namespace frontend {
 
-using support::token;
-using support::bformat;
-using support::findToken;
-using support::getVectorFromString;
-
 /////////////////////////////////////////////////////////////////////
 //
 // PreambleModule
@@ -218,7 +204,7 @@ void PreambleModule::closeEvent(QCloseEvent * e)
 
 
 
-GuiDocument::GuiDocument(LyXView & lv)
+GuiDocument::GuiDocument(GuiView & lv)
        : GuiDialog(lv, "document")
 {
        setupUi(this);
@@ -624,6 +610,15 @@ GuiDocument::GuiDocument(LyXView & lv)
        connect(bulletsModule, SIGNAL(changed()),
                this, SLOT(change_adaptor()));
 
+       // embedded files
+       embeddedFilesModule = new UiWidget<Ui::EmbeddedFilesUi>;
+       connect(embeddedFilesModule->bundleCB, SIGNAL(toggled(bool)),
+               this, SLOT(change_adaptor()));
+       connect(embeddedFilesModule->addPB, SIGNAL(clicked()),
+               this, SLOT(change_adaptor()));
+       connect(embeddedFilesModule->removePB, SIGNAL(clicked()),
+               this, SLOT(change_adaptor()));
+
        // PDF support
        pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
 
@@ -653,6 +648,8 @@ GuiDocument::GuiDocument(LyXView & lv)
                this, SLOT(change_adaptor()));
        connect(pdfSupportModule->backrefCB, SIGNAL(toggled(bool)),
                this, SLOT(change_adaptor()));
+       connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
+               this, SLOT(change_adaptor()));
        connect(pdfSupportModule->pagebackrefCB, SIGNAL(toggled(bool)),
                this, SLOT(change_adaptor()));
        connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
@@ -678,6 +675,7 @@ GuiDocument::GuiDocument(LyXView & lv)
        docPS->addPanel(floatModule, _("Float Placement"));
        docPS->addPanel(bulletsModule, _("Bullets"));
        docPS->addPanel(branchesModule, _("Branches"));
+       docPS->addPanel(embeddedFilesModule, _("Embedded Files"));
        docPS->addPanel(preambleModule, _("LaTeX Preamble"));
        docPS->setCurrentPanel(_("Document Class"));
 // FIXME: hack to work around resizing bug in Qt >= 4.2
@@ -915,7 +913,7 @@ void GuiDocument::updatePagestyle(string const & items, string const & sel)
 void GuiDocument::classChanged()
 {
        textclass_type const tc = latexModule->classCO->currentIndex();
-       bp_.setJustBaseClass(tc);
+       bp_.setBaseClass(tc);
        if (lyxrc.auto_reset_options)
                bp_.useClassDefaults();
        updateContents();
@@ -953,13 +951,46 @@ void GuiDocument::updateModuleInfo()
                        }
                        pkgdesc += pkgList[i];
                }
-               if (!pkgdesc.empty())
-                       desc += " Requires " + pkgdesc + ".";
+               if (!pkgdesc.empty()) {
+                       if (!desc.empty())
+                               desc += " ";
+                       desc += ("Requires " + pkgdesc + ".");
+               }
+               if (!isModuleAvailable(modName)) {
+                       if (!desc.empty())
+                               desc += "\n";
+                       desc += "WARNING: Some packages are unavailable!";
+               }
                latexModule->infoML->document()->setPlainText(toqstr(desc));
        }
 }
 
 
+void GuiDocument::updateEmbeddedFileList()
+{
+       embeddedFilesModule->filesLW->clear();
+       // add current embedded files
+       EmbeddedFileList & files = buffer().embeddedFiles();
+       files.update(buffer());
+       EmbeddedFileList::iterator fit = files.begin();
+       EmbeddedFileList::iterator fit_end = files.end();
+       for (; fit != fit_end; ++fit) {
+               QString label = toqstr(fit->relFilename(buffer().filePath()));
+               if (fit->refCount() > 1)
+                       label += " (" + QString::number(fit->refCount()) + ")";
+               QListWidgetItem * item = new QListWidgetItem(label);
+               item->setFlags(item->flags() | Qt::ItemIsSelectable
+                       | Qt::ItemIsUserCheckable);
+               if(fit->embedded())
+                       item->setCheckState(Qt::Checked);
+               else
+                       item->setCheckState(Qt::Unchecked);
+               // index of the currently used ParConstIterator
+               embeddedFilesModule->filesLW->addItem(item);
+       }
+}
+
+
 void GuiDocument::updateNumbering()
 {
        TextClass const & tclass = bp_.getTextClass();
@@ -1066,13 +1097,15 @@ void GuiDocument::apply(BufferParams & params)
        params.graphicsDriver =
                tex_graphics[latexModule->psdriverCO->currentIndex()];
        
+       // text layout
+       params.setBaseClass(latexModule->classCO->currentIndex());
+
        // Modules
        params.clearLayoutModules();
        QStringList const selMods = selectedModel()->stringList();
        for (int i = 0; i != selMods.size(); ++i)
                params.addLayoutModule(lyx::fromqstr(selMods[i]));
 
-
        if (mathsModule->amsautoCB->isChecked()) {
                params.use_amsmath = BufferParams::package_auto;
        } else {
@@ -1091,9 +1124,6 @@ void GuiDocument::apply(BufferParams & params)
                        params.use_esint = BufferParams::package_off;
        }
 
-       // text layout
-       params.setJustBaseClass(latexModule->classCO->currentIndex());
-
        if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
                params.pagestyle = "default";
        else {
@@ -1207,9 +1237,9 @@ void GuiDocument::apply(BufferParams & params)
                pageLayoutModule->paperheightUnitCO);
 
        if (pageLayoutModule->facingPagesCB->isChecked())
-               params.sides = TextClass::TwoSides;
+               params.sides = TwoSides;
        else
-               params.sides = TextClass::OneSide;
+               params.sides = OneSide;
 
        if (pageLayoutModule->landscapeRB->isChecked())
                params.orientation = ORIENTATION_LANDSCAPE;
@@ -1248,6 +1278,7 @@ void GuiDocument::apply(BufferParams & params)
 
        pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
        pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
+       pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
        pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
        pdf.backref = pdfSupportModule->backrefCB->isChecked();
        pdf.pagebackref = pdfSupportModule->pagebackrefCB->isChecked();
@@ -1256,8 +1287,9 @@ void GuiDocument::apply(BufferParams & params)
        else
                pdf.pagemode.clear();
        pdf.quoted_options = fromqstr(pdfSupportModule->optionsLE->text());
-       if (pdf.use_hyperref || !pdf.empty())
-               pdf.store_options = true;
+
+       // Embedded files
+       // FIXME
 }
 
 
@@ -1265,10 +1297,10 @@ void GuiDocument::apply(BufferParams & params)
     If not found, return 0.
  */
 template<class A>
-static size_t findPos(std::vector<A> const & vec, A const & val)
+static size_t findPos(vector<A> const & vec, A const & val)
 {
-       typename std::vector<A>::const_iterator it =
-               std::find(vec.begin(), vec.end(), val);
+       typename vector<A>::const_iterator it =
+               find(vec.begin(), vec.end(), val);
        if (it == vec.end())
                return 0;
        return distance(vec.begin(), it);
@@ -1502,7 +1534,7 @@ void GuiDocument::updateParams(BufferParams const & params)
        pageLayoutModule->portraitRB->setChecked(!landscape);
 
        pageLayoutModule->facingPagesCB->setChecked(
-               params.sides == TextClass::TwoSides);
+               params.sides == TwoSides);
 
 
        lengthToWidgets(pageLayoutModule->paperwidthLE,
@@ -1555,6 +1587,7 @@ void GuiDocument::updateParams(BufferParams const & params)
 
        pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
        pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
+       pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
        pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
        pdfSupportModule->backrefCB->setChecked(pdf.backref);
        pdfSupportModule->pagebackrefCB->setChecked(pdf.pagebackref);
@@ -1563,6 +1596,9 @@ void GuiDocument::updateParams(BufferParams const & params)
 
        pdfSupportModule->optionsLE->setText(
                toqstr(pdf.quoted_options));
+
+       // embedded files
+       updateEmbeddedFileList();
 }
 
 
@@ -1602,7 +1638,7 @@ void GuiDocument::updateContents()
 
 void GuiDocument::useClassDefaults()
 {
-       bp_.setJustBaseClass(latexModule->classCO->currentIndex());
+       bp_.setBaseClass(latexModule->classCO->currentIndex());
        bp_.useClassDefaults();
        updateContents();
 }
@@ -1660,13 +1696,12 @@ string GuiDocument::getModuleDescription(string const & modName) const
 {
        LyXModule const * const mod = moduleList[modName];
        if (!mod)
-               return string("Module unavailable!");
+               return string("Module not found!");
        return mod->description;
 }
 
 
-vector<string>
-GuiDocument::getPackageList(string const & modName) const
+vector<string> GuiDocument::getPackageList(string const & modName) const
 {
        LyXModule const * const mod = moduleList[modName];
        if (!mod)
@@ -1675,6 +1710,15 @@ GuiDocument::getPackageList(string const & modName) const
 }
 
 
+bool GuiDocument::isModuleAvailable(string const & modName) const
+{
+       LyXModule * mod = moduleList[modName];
+       if (!mod)
+               return false;
+       return mod->isAvailable();
+}
+
+
 TextClass const & GuiDocument::textClass() const
 {
        return textclasslist[bp_.getBaseClass()];
@@ -1699,8 +1743,6 @@ void GuiDocument::dispatchParams()
 
        // Apply the BufferParams. Note that this will set the base class
        // and then update the buffer's layout.
-       //FIXME Could this be done last? Then, I think, we'd get the automatic
-       //update mentioned in the next FIXME...
        dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
 
        // Generate the colours requested by each new branch.
@@ -1722,8 +1764,7 @@ void GuiDocument::dispatchParams()
                        "assign branch"));
        }
        // FIXME: If we used an LFUN, we would not need those two lines:
-       bufferview()->update();
-       lyxview().currentWorkArea()->redraw();
+       bufferview()->processUpdateFlags(Update::Force | Update::FitCursor);
 }
 
 
@@ -1805,7 +1846,7 @@ void GuiDocument::loadModuleNames ()
 }
 
 
-Dialog * createGuiDocument(LyXView & lv) { return new GuiDocument(lv); }
+Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
 
 
 } // namespace frontend