]> git.lyx.org Git - features.git/commitdiff
various toc-related fixes
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 12 May 2005 10:16:04 +0000 (10:16 +0000)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 12 May 2005 10:16:04 +0000 (10:16 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9938 a592a061-630c-0410-9148-cb99ea01b6c8

12 files changed:
src/ChangeLog
src/MenuBackend.C
src/buffer_funcs.C
src/frontends/qt2/ChangeLog
src/frontends/qt2/QDocument.C
src/frontends/qt2/QDocumentDialog.C
src/frontends/qt2/QDocumentDialog.h
src/lyxlayout.C
src/lyxlayout.h
src/lyxtextclass.C
src/lyxtextclass.h
src/toc.C

index b3cbba7338f7ca90548ec3cec62b6087110ffa7e..92fadf5e853916a54ae6b6ebdd0bef416a9db4f8 100644 (file)
@@ -1,8 +1,29 @@
+<<<<<<< ChangeLog
+2005-05-10  Jean-Marc Lasgouttes  <lasgouttes@lyx.org>
+
+       * buffer_funcs.C (setCounter): fix test for numbering of
+       environments. 
+
+       * toc.C (getTocList): use LyXTextClass:min_toclevel to set toc
+       depth correctly; use optional argument when it exists
+
+       * lyxtextclass.C: remove unused MaxCounterTags enum
+       (Read): compute min_toclevel_ and max_toclevel_ after reading class.
+       (max_toclevel, min_toclevel): new methods.
+
+       * MenuBackend.C (expandToc2): fix case where depth is smaller than
+       the smallest depth in toc.
+
+       * lyxlayout.[Ch]: add special NOT_IN_TOC toclevel value for
+       layouts that should not appear in a table of contents.
+       
+=======
 2005-05-11  Lars Gullik Bjonnes  <larsbj@gullik.net>
 
        * buffer.C (save): check if destination is writable before trying
        to copy a file
 
+>>>>>>> 1.2180
 2005-05-11  Martin Vermeer  <martin.vermeer@hut.fi>
 
        * BufferView_pimpl.C (update): fix processEvents -caused update
index 50a0a9b00f31a31a21cdb83af792796c288cad10..a96b1ec17baaf7b19e7ad80f805bd8730c23c68e 100644 (file)
@@ -607,6 +607,15 @@ void expandToc2(Menu & tomenu,
                lyx::toc::Toc::size_type to, int depth)
 {
        int shortcut_count = 0;
+
+       // check whether depth is smaller than the smallest depth in toc.
+       int min_depth = 1000;
+       for (lyx::toc::Toc::size_type i = from; i < to; ++i) 
+               min_depth = std::min(min_depth, toc_list[i].depth);
+       if (min_depth > depth)
+               depth = min_depth;
+
+
        if (to - from <= max_number_of_items) {
                for (lyx::toc::Toc::size_type i = from; i < to; ++i) {
                        string label(4 * max(0, toc_list[i].depth - depth),' ');
index 61cf756fc43e1c5ac08cc01d409dd7b8096c19d7..c3902373af5a878ef0b879ab2f87589c20773b64 100644 (file)
@@ -379,7 +379,7 @@ void setCounter(Buffer const & buf, ParIterator & it)
        // is it a layout that has an automatic label?
        if (layout->labeltype == LABEL_COUNTER) {
                if (layout->toclevel <= buf.params().secnumdepth
-                   && (!layout->isEnvironment()
+                   && (layout->latextype != LATEX_ENVIRONMENT
                        || isFirstInSequence(it.pit(), it.plist()))) {
                        counters.step(layout->counter);
                        string label = expandLabel(textclass, layout,
index 87e56d8a6f6ae76d67cb39b72294cd1afd8229a4..152374fca5ea76defe3940d1d75979f13d966d4a 100644 (file)
@@ -5,6 +5,20 @@
        * QMathDialog.C (resizeEvent): use lyx_gui::sync_events instead of
        the event loop.
 
+2005-05-11  Jean-Marc Lasgouttes  <lasgouttes@lyx.org>
+
+       * QDocument.C (update_contents): set the limits of the numbering
+       sliders depending on the class; disable the numbering module when
+       the class does not have a sectioning structure.
+
+       * QDocumentDialog.h: remove the numberlevel* listviewitems.
+
+       * QDocumentDialog.C (QDocumentDialog): no need to populate
+       numbering listview here.
+       (classChanged): always invoke QDocument::update_content().
+       (updateNumbering): populate the listview directly from the
+       textclass information;
+
 2005-05-11  Jean-Marc Lasgouttes  <lasgouttes@lyx.org>
 
        * lyx_gui.C (sync_events):
index 181f9c7bcc484e2320d211d1dfa1264d6574a36b..273e122d6a2ff77b6da9385b871747b0def61115 100644 (file)
@@ -36,6 +36,7 @@
 #include <qcheckbox.h>
 #include <qslider.h>
 #include <qlineedit.h>
+#include <qlistview.h>
 #include "lengthcombo.h"
 
 
@@ -511,8 +512,20 @@ void QDocument::update_contents()
        }
 
        // numbering
-       dialog_->numberingModule->tocSL->setValue(params.tocdepth);
+       int const min_toclevel = controller().textClass().min_toclevel();
+       int const max_toclevel = controller().textClass().max_toclevel();
+       if (min_toclevel != LyXLayout::NOT_IN_TOC) 
+               dialog_->numberingModule->setEnabled(true);
+       else {
+               dialog_->numberingModule->setEnabled(false);
+               dialog_->numberingModule->tocLV->clear();
+       }
+       dialog_->numberingModule->depthSL->setMinValue(min_toclevel - 1);
+       dialog_->numberingModule->depthSL->setMaxValue(max_toclevel);
        dialog_->numberingModule->depthSL->setValue(params.secnumdepth);
+       dialog_->numberingModule->tocSL->setMinValue(min_toclevel - 1);
+       dialog_->numberingModule->tocSL->setMaxValue(max_toclevel);
+       dialog_->numberingModule->tocSL->setValue(params.tocdepth);
        dialog_->updateNumbering();
 
        // bullets
index d66a7616fabae9ebc40d90f4f08383a88af25195..daad83f66a7062c2fc5ec0ec6fdf8b45e24d7576 100644 (file)
@@ -211,22 +211,6 @@ QDocumentDialog::QDocumentDialog(QDocument * form)
                marginsModule->headheightLE));
        marginsModule->footskipLE->setValidator(unsignedLengthValidator(
                marginsModule->footskipLE));
-
-       // create the numbering items, in reverse order
-       numberlevel7 =
-               new QListViewItem(numberingModule->tocLV, qt_("Subparagraph"));
-       numberlevel6 =
-               new QListViewItem(numberingModule->tocLV, qt_("Paragraph"));
-       numberlevel5 =
-               new QListViewItem(numberingModule->tocLV, qt_("Subsubsection"));
-       numberlevel4 =
-               new QListViewItem(numberingModule->tocLV, qt_("Subsection"));
-       numberlevel3 =
-               new QListViewItem(numberingModule->tocLV, qt_("Section"));
-       numberlevel2 =
-               new QListViewItem(numberingModule->tocLV, qt_("Chapter"));
-       numberlevel1 =
-               new QListViewItem(numberingModule->tocLV, qt_("Part"));
 }
 
 
@@ -407,17 +391,9 @@ void QDocumentDialog::classChanged()
 
        if (form_->controller().loadTextclass(tc)) {
                params.textclass = tc;
-
-               if (lyxrc.auto_reset_options) {
+               if (lyxrc.auto_reset_options) 
                        params.useClassDefaults();
-                       form_->update_contents();
-               } else {
-                       updateFontsize(cntrl.textClass().opt_fontsize(),
-                                      params.fontsize);
-                       updatePagestyle(cntrl.textClass().opt_pagestyle(),
-                                       params.pagestyle);
-                       updateNumbering();
-               }
+               form_->update_contents();
        } else {
                latexModule->classCO->setCurrentItem(params.textclass);
        }
@@ -426,61 +402,28 @@ void QDocumentDialog::classChanged()
 
 void QDocumentDialog::updateNumbering()
 {
-       int const depth = numberingModule->depthSL->value();
-       int const toc = numberingModule->tocSL->value();
-
-       // check if the document class features chapter
        LyXTextClass const & tclass =
                form_->controller().params().getLyXTextClass();
-       bool const hasChapter = tclass.hasLayout("Chapter");
-
-       QString const no = qt_("No");
-       QString const yes = qt_("Yes");
 
        //numberingModule->tocLV->setUpdatesEnabled(false);
 
-       numberlevel1->setText(1, yes);
-       numberlevel2->setText(1, yes);
-       numberlevel3->setText(1, yes);
-       numberlevel4->setText(1, yes);
-       numberlevel5->setText(1, yes);
-       numberlevel6->setText(1, yes);
-       numberlevel7->setText(1, yes);
-
-       numberlevel1->setText(2, yes);
-       numberlevel2->setText(2, yes);
-       numberlevel3->setText(2, yes);
-       numberlevel4->setText(2, yes);
-       numberlevel5->setText(2, yes);
-       numberlevel6->setText(2, yes);
-       numberlevel7->setText(2, yes);
-
-       // numbering
-       if (depth < -1) numberlevel1->setText(1, no);
-       if (depth < 0) numberlevel2->setText(1, no);
-       if (depth < 1) numberlevel3->setText(1, no);
-       if (depth < 2) numberlevel4->setText(1, no);
-       if (depth < 3) numberlevel5->setText(1, no);
-       if (depth < 4) numberlevel6->setText(1, no);
-       if (depth < 5) numberlevel7->setText(1, no);
-
-       // in toc
-       if (toc < 0 && hasChapter) numberlevel2->setText(2, no);
-       if (toc < 1) numberlevel3->setText(2, no);
-       if (toc < 2) numberlevel4->setText(2, no);
-       if (toc < 3) numberlevel5->setText(2, no);
-       if (toc < 4) numberlevel6->setText(2, no);
-       if (toc < 5) numberlevel7->setText(2, no);
-
-       // in article style classes, the part number is shifted by 1
-       if (!hasChapter) {
-               numberlevel1->setText(0, qt_(""));
-               numberlevel1->setText(1, qt_(""));
-               numberlevel1->setText(2, qt_(""));
-               numberlevel2->setText(0, qt_("Part"));
-       } else {
-               numberlevel1->setText(0, qt_("Part"));
-               numberlevel2->setText(0, qt_("Chapter"));
+       // Update the example QListView
+       int const depth = numberingModule->depthSL->value();
+       int const toc = numberingModule->tocSL->value();
+       QString const no = qt_("No");
+       QString const yes = qt_("Yes");
+       LyXTextClass::const_iterator end = tclass.end();
+       LyXTextClass::const_iterator cit = tclass.begin();
+       numberingModule->tocLV->clear();
+       QListViewItem * item = 0;
+       for ( ; cit != end ; ++cit) {
+               int const toclevel = (*cit)->toclevel;
+               if (toclevel != LyXLayout::NOT_IN_TOC) {
+                       item = new QListViewItem(numberingModule->tocLV, 
+                                                item, qt_((*cit)->name()));
+                       item->setText(1, (toclevel <= depth) ? yes : no);
+                       item->setText(2, (toclevel <= toc) ? yes : no);
+               }
        }
 
        //numberingModule->tocLV->setUpdatesEnabled(true);
index 29056dff2c23786c5829f149f57063a4d73fa423..bea8ef735bcc1e1dbf13ea08b3be8732b8a4306f 100644 (file)
@@ -87,14 +87,6 @@ private:
        FloatPlacement * floatModule;
        BranchesModuleBase * branchesModule;
 
-       QListViewItem * numberlevel7;
-       QListViewItem * numberlevel6;
-       QListViewItem * numberlevel5;
-       QListViewItem * numberlevel4;
-       QListViewItem * numberlevel3;
-       QListViewItem * numberlevel2;
-       QListViewItem * numberlevel1;
-
        QDocument * form_;
 };
 
index 9cf7ffa447c8a84a2056b3ad91aa5e38f4d21fbc..1e77971b8765c237b1e54f899a8e0e81d028a4e3 100644 (file)
@@ -25,6 +25,8 @@ using lyx::support::trim;
 using std::endl;
 using std::string;
 
+/// Special value of toclevel for layouts that to not belong in a TOC
+const int LyXLayout::NOT_IN_TOC = -1000;
 
 //  The order of the LayoutTags enum is no more important. [asierra300396]
 // Tags indexes.
@@ -121,7 +123,7 @@ LyXLayout::LyXLayout ()
        free_spacing = false;
        pass_thru = false;
        is_environment = false;
-       toclevel = -2;
+       toclevel = NOT_IN_TOC;
        commanddepth = 0;
 }
 
index 25d07d90a8fa5dbb87dfba3c49056266bb7e526c..d437fde31f0d248d6fb15e8392ce9b8fc071e766 100644 (file)
@@ -149,6 +149,8 @@ public:
        bool is_environment;
        /// show this in toc
        int toclevel;
+       /// special value of toclevel for non-section layouts
+       static const int NOT_IN_TOC;
        /// for new environment insets
        std::string latexheader;
        /// for new environment insets
index 168520301dfa345535120f4a6dec85d789450db4..6d74da3b1671288fa01282d77ecc0ba993df9875 100644 (file)
@@ -384,6 +384,27 @@ bool LyXTextClass::Read(string const & filename, bool merge)
                               << "' is missing a defaultstyle." << endl;
                        error = true;
                }
+
+               min_toclevel_ = LyXLayout::NOT_IN_TOC;
+               max_toclevel_ = LyXLayout::NOT_IN_TOC;
+               const_iterator cit = begin();
+               const_iterator the_end = end();
+               for ( ; cit != the_end ; ++cit) {
+                       int const toclevel = (*cit)->toclevel;
+                       if (toclevel != LyXLayout::NOT_IN_TOC) {
+                               if (min_toclevel_ == LyXLayout::NOT_IN_TOC)
+                                       min_toclevel_ = toclevel;
+                               else
+                                       min_toclevel_ = std::min(min_toclevel_, 
+                                                        toclevel);
+                               max_toclevel_ = std::max(max_toclevel_, 
+                                                        toclevel);
+                       }
+               }
+               lyxerr[Debug::TCLASS] 
+                       << "Minimum TocLevel is " << min_toclevel_
+                       << ", maximum is " << max_toclevel_ <<endl;
+                       
        } else
                lyxerr[Debug::TCLASS] << "Finished reading input file "
                                      << MakeDisplayPath(filename)
@@ -451,20 +472,6 @@ void LyXTextClass::readOutputType(LyXLex & lexrc)
 }
 
 
-enum MaxCounterTags {
-       MC_COUNTER_CHAPTER = 1,
-       MC_COUNTER_SECTION,
-       MC_COUNTER_SUBSECTION,
-       MC_COUNTER_SUBSUBSECTION,
-       MC_COUNTER_PARAGRAPH,
-       MC_COUNTER_SUBPARAGRAPH,
-       MC_COUNTER_ENUMI,
-       MC_COUNTER_ENUMII,
-       MC_COUNTER_ENUMIII,
-       MC_COUNTER_ENUMIV
-};
-
-
 enum ClassOptionsTags {
        CO_FONTSIZE = 1,
        CO_PAGESTYLE,
@@ -1011,6 +1018,18 @@ int LyXTextClass::size() const
 }
 
 
+int LyXTextClass::min_toclevel() const
+{
+       return min_toclevel_;
+}
+
+
+int LyXTextClass::max_toclevel() const
+{
+       return max_toclevel_;
+}
+
+
 ostream & operator<<(ostream & os, LyXTextClass::PageSides p)
 {
        switch (p) {
index a52cd7ab5973d744492793b8b1eaf492dee658fa..e602b4041b453a6238509d191a3ff56905da67f1 100644 (file)
@@ -172,6 +172,10 @@ public:
 
        ///
        int size() const;
+       /// The minimal TocLevel of sectioning layouts
+       int min_toclevel() const;
+       /// The maximal TocLevel of sectioning layouts
+       int max_toclevel() const;
 private:
        ///
        bool delete_layout(std::string const &);
@@ -242,6 +246,11 @@ private:
 
        /// Is the TeX class available?
        bool texClassAvail_;
+
+       /// The minimal TocLevel of sectioning layouts
+       int min_toclevel_;
+       /// The maximal TocLevel of sectioning layouts
+       int max_toclevel_;
 };
 
 
index 603912ab55343b142dda1381799b8edd38116356..cfb9f9724a8cbb65117a7263f6673f04f77917e0 100644 (file)
--- a/src/toc.C
+++ b/src/toc.C
@@ -23,6 +23,7 @@
 #include "frontends/LyXView.h"
 
 #include "insets/insetfloat.h"
+#include "insets/insetoptarg.h"
 #include "insets/insetwrap.h"
 
 #include "support/convert.h"
@@ -69,31 +70,55 @@ TocList const getTocList(Buffer const & buf)
        TocList toclist;
 
        BufferParams const & bufparams = buf.params();
+       const int min_toclevel = bufparams.getLyXTextClass().min_toclevel();
 
        ParConstIterator pit = buf.par_iterator_begin();
        ParConstIterator end = buf.par_iterator_end();
        for (; pit != end; ++pit) {
 
-               int const toclevel = pit->layout()->toclevel;
-               if (toclevel > 0 && toclevel <= bufparams.tocdepth) {
-                       // insert this into the table of contents
-                       TocItem const item(pit->id(), toclevel - 1, pit->asString(buf, true));
-                       toclist["TOC"].push_back(item);
-               }
+               // the string that goes to the toc (could be the optarg)
+               string tocstring;
 
                // For each paragraph, traverse its insets and look for
                // FLOAT_CODE or WRAP_CODE
                InsetList::const_iterator it = pit->insetlist.begin();
                InsetList::const_iterator end = pit->insetlist.end();
                for (; it != end; ++it) {
-                       if (it->inset->lyxCode() == InsetBase::FLOAT_CODE) {
+                       switch (it->inset->lyxCode()) {
+                       case InsetBase::FLOAT_CODE:
                                static_cast<InsetFloat*>(it->inset)
                                        ->addToToc(toclist, buf);
-                       } else if (it->inset->lyxCode() == InsetBase::WRAP_CODE) {
+                               break;
+                       case InsetBase::WRAP_CODE:
                                static_cast<InsetWrap*>(it->inset)
                                        ->addToToc(toclist, buf);
+                               break;
+                       case InsetBase::OPTARG_CODE: {
+                               if (!tocstring.empty())
+                                       break;
+                               Paragraph const & par = *static_cast<InsetOptArg*>(it->inset)->paragraphs().begin();
+                               if (!pit->getLabelstring().empty())
+                                       tocstring = pit->getLabelstring() 
+                                               + ' ';
+                               tocstring += par.asString(buf, false);
+                               break;
+                       }
+                       default:
+                               break;
                        }
                }
+
+               /// now the toc entry for the paragraph
+               int const toclevel = pit->layout()->toclevel;
+               if (toclevel >= min_toclevel 
+                   && toclevel <= bufparams.tocdepth) {
+                       // insert this into the table of contents
+                       if (tocstring.empty())
+                               tocstring = pit->asString(buf, true);
+                       TocItem const item(pit->id(), toclevel - min_toclevel, 
+                                          tocstring);
+                       toclist["TOC"].push_back(item);
+               }
        }
        return toclist;
 }