Attached, trying to take into account discussions since. OK to commit? No document format change, and I don't expect the user base will want to wait until 1.5 ;-)
- Martin
Index: LyXAction.C =================================================================== --- LyXAction.C (revision 13690) +++ LyXAction.C (working copy) @@ -240,6 +240,7 @@ void LyXAction::init() { LFUN_DOWN_PARAGRAPH, "paragraph-down", ReadOnly | NoUpdate}, { LFUN_DOWN_PARAGRAPHSEL, "paragraph-down-select", ReadOnly }, { LFUN_GOTO_PARAGRAPH, "paragraph-goto", ReadOnly }, + { LFUN_OUTLINE, "outline", ReadOnly }, { LFUN_PARAGRAPH_SPACING, "paragraph-spacing", Noop }, { LFUN_UP_PARAGRAPH, "paragraph-up", ReadOnly | NoUpdate}, { LFUN_UP_PARAGRAPHSEL, "paragraph-up-select", ReadOnly }, Index: BufferView_pimpl.C =================================================================== --- BufferView_pimpl.C (revision 13690) +++ BufferView_pimpl.C (working copy) @@ -49,6 +49,7 @@ #include "ParagraphParameters.h" #include "pariterator.h" #include "rowpainter.h" +#include "toc.h" #include "undo.h" #include "vspace.h" @@ -1042,6 +1043,7 @@ FuncStatus BufferView::Pimpl::getStatus( case LFUN_INSERT_LABEL: case LFUN_BOOKMARK_SAVE: case LFUN_GOTO_PARAGRAPH: + case LFUN_OUTLINE: case LFUN_GOTOERROR: case LFUN_GOTONOTE: case LFUN_REFERENCE_GOTO: @@ -1196,6 +1198,16 @@ bool BufferView::Pimpl::dispatch(FuncReq break; } + case LFUN_OUTLINE: { + lyx::toc::OutlineOp const op = + static_cast<lyx::toc::OutlineOp>(convert<int>(cmd.argument)); + lyx::toc::outline(op, buffer_, cursor_.pit()); + bv_->text()->setCursor(cursor_, cursor_.pit(), 0); + buffer_->markDirty(); + updateCounters(*buffer_); + update(); + } + case LFUN_GOTOERROR: bv_funcs::gotoInset(bv_, InsetBase::ERROR_CODE, false); break; Index: frontends/qt2/QTocDialog.C =================================================================== --- frontends/qt2/QTocDialog.C (revision 13690) +++ frontends/qt2/QTocDialog.C (working copy) @@ -32,8 +32,11 @@ QTocDialog::QTocDialog(QToc * form) if (w) w->hide(); - connect(closePB, SIGNAL(clicked()), - form, SLOT(slotClose())); + connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose())); + connect(moveupPB, SIGNAL(clicked()), this, SLOT(moveup_adaptor())); + connect(movednPB, SIGNAL(clicked()), this, SLOT(movedn_adaptor())); + connect(moveinPB, SIGNAL(clicked()), this, SLOT(movein_adaptor())); + connect(moveoutPB, SIGNAL(clicked()), this, SLOT(moveout_adaptor())); } @@ -66,6 +69,30 @@ void QTocDialog::update_adaptor() } +void QTocDialog::moveup_adaptor() +{ + form_->moveup(); +} + + +void QTocDialog::movedn_adaptor() +{ + form_->movedn(); +} + + +void QTocDialog::movein_adaptor() +{ + form_->movein(); +} + + +void QTocDialog::moveout_adaptor() +{ + form_->moveout(); +} + + void QTocDialog::closeEvent(QCloseEvent * e) { form_->slotWMHide(); Index: frontends/qt2/ui/QTocDialogBase.ui =================================================================== --- frontends/qt2/ui/QTocDialogBase.ui (revision 13690) +++ frontends/qt2/ui/QTocDialogBase.ui (working copy) @@ -168,7 +168,51 @@ </property> <property stdset="1"> <name>text</name> - <string>&Update</string> + <string>U&pdate</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>moveupPB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&Up</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>movednPB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&Down</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>moveinPB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&In</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>moveoutPB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&Out</string> </property> </widget> <spacer> Index: frontends/qt2/QTocDialog.h =================================================================== --- frontends/qt2/QTocDialog.h (revision 13690) +++ frontends/qt2/QTocDialog.h (working copy) @@ -29,6 +29,10 @@ public slots: void depth_adaptor(int); void select_adaptor(QListViewItem *); void update_adaptor(); + void moveup_adaptor(); + void movedn_adaptor(); + void movein_adaptor(); + void moveout_adaptor(); protected: void closeEvent(QCloseEvent * e); private: Index: frontends/qt2/QToc.C =================================================================== --- frontends/qt2/QToc.C (revision 13690) +++ frontends/qt2/QToc.C (working copy) @@ -107,7 +107,9 @@ void QToc::updateToc(int newdepth) QListViewItem * last = 0; QListViewItem * parent = 0; QListViewItem * item; - + QListViewItem * selected_item = 0; + bool multiple = false; + // Yes, it is this ugly. Two reasons - root items must have // a QListView parent, rather than QListViewItem; and the // TOC can move in and out an arbitrary number of levels @@ -157,10 +159,24 @@ void QToc::updateToc(int newdepth) item->setOpen(iter->depth < depth_); curdepth = iter->depth; last = item; + + // Recognise part past the counter + if (iter->str.substr(iter->str.find(' ') + 1) == text_) { + if (selected_item == 0) + selected_item = item; + else + // more than one match + multiple = true; + } } dialog_->tocLV->setUpdatesEnabled(true); dialog_->tocLV->update(); + if (!multiple) { + dialog_->tocLV->scrollBy(0, selected_item->itemPos() + - dialog_->tocLV->height() / 2); + dialog_->tocLV->setSelected(selected_item, true); + } setTitle(fromqstr(dialog_->typeCO->currentText())); } @@ -180,6 +196,8 @@ void QToc::select(string const & text) return; } + // Lop off counter part and save: + text_ = text.substr(text.find(' ') + 1); controller().goTo(*iter); } @@ -190,5 +208,34 @@ void QToc::set_depth(int depth) updateToc(depth); } + +void QToc::moveup() +{ + controller().outline(toc::Up); + update_contents(); +} + + +void QToc::movedn() +{ + controller().outline(toc::Down); + update_contents(); +} + + +void QToc::movein() +{ + controller().outline(toc::In); + update_contents(); +} + + +void QToc::moveout() +{ + controller().outline(toc::Out); + update_contents(); +} + + } // namespace frontend } // namespace lyx Index: frontends/qt2/QToc.h =================================================================== --- frontends/qt2/QToc.h (revision 13690) +++ frontends/qt2/QToc.h (working copy) @@ -42,6 +42,15 @@ private: /// set the depth void set_depth(int depth); + /// Move header up/down/in/out in list (outlining) + void moveup(); + /// + void movedn(); + /// + void movein(); + /// + void moveout(); + virtual void apply() {} /// update dialog @@ -55,6 +64,9 @@ private: /// depth of list shown int depth_; + + /// Store selected item's string + std::string text_; }; } // namespace frontend Index: frontends/controllers/ControlToc.C =================================================================== --- frontends/controllers/ControlToc.C (revision 13690) +++ frontends/controllers/ControlToc.C (working copy) @@ -8,9 +8,12 @@ * Full author contact details are available in file CREDITS. */ +#include <sstream> + #include <config.h> #include "ControlToc.h" +#include "funcrequest.h" #include "gettext.h" using std::vector; @@ -34,6 +37,14 @@ void ControlToc::goTo(toc::TocItem const } +void ControlToc::outline(toc::OutlineOp op) +{ + std::ostringstream o; + o << op << std::flush; + kernel().dispatch(FuncRequest(LFUN_OUTLINE, o.str())); +} + + vector<string> const ControlToc::getTypes() const { return toc::getTypes(kernel().buffer()); Index: frontends/controllers/ControlToc.h =================================================================== --- frontends/controllers/ControlToc.h (revision 13690) +++ frontends/controllers/ControlToc.h (working copy) @@ -38,6 +38,9 @@ public: /// Given a type, returns the contents toc::Toc const getContents(std::string const & type) const; + + /// Apply the selected outlining operation + void outline(toc::OutlineOp op); }; } // namespace frontend Index: lfuns.h =================================================================== --- lfuns.h (revision 13690) +++ lfuns.h (working copy) @@ -357,6 +357,7 @@ enum kb_action { LFUN_BIBDB_ADD, LFUN_BIBDB_DEL, LFUN_INSERT_CITATION, + LFUN_OUTLINE, // Vermeer 20060323 LFUN_LASTACTION // end of the table }; Index: toc.C =================================================================== --- toc.C (revision 13690) +++ toc.C (working copy) @@ -19,7 +19,6 @@ #include "funcrequest.h" #include "LyXAction.h" #include "paragraph.h" -#include "pariterator.h" #include "frontends/LyXView.h" @@ -167,5 +166,106 @@ void asciiTocList(string const & type, B } +void outline(OutlineOp mode, Buffer * buf, pit_type & pit) +{ + ParagraphList & pars = buf->text().paragraphs(); + ParagraphList::iterator bgn = pars.begin(); + ParagraphList::iterator s = boost::next(bgn, pit); + ParagraphList::iterator p = s; + ParagraphList::iterator end = pars.end(); + + LyXTextClass::const_iterator lit = + buf->params().getLyXTextClass().begin(); + LyXTextClass::const_iterator const lend = + buf->params().getLyXTextClass().end(); + + int const thistoclevel = s->layout()->toclevel; + int toclevel; + switch (mode) { + case Up: { + if (p != end) + ++p; + for (; p != end; ++p) { + toclevel = p->layout()->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC + && toclevel <= thistoclevel) { + break; + } + } + ParagraphList::iterator q = s; + if (q != bgn) + --q; + else + break; + for (; q != bgn; --q) { + toclevel = q->layout()->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC + && toclevel <= thistoclevel) { + break; + } + } + pit_type const newpit = std::distance(pars.begin(), q); + pit_type const len = std::distance(s, p); + pit += len; + pars.insert(q, s, p); + s = boost::next(pars.begin(), pit); + ParagraphList::iterator t = boost::next(s, len); + pit = newpit; + pars.erase(s, t); + break; + } + case Down: { + if (p != end) + ++p; + for (; p != end; ++p) { + toclevel = p->layout()->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC + && toclevel <= thistoclevel) { + break; + } + } + ParagraphList::iterator q = p; + if (q != end) + ++q; + else + break; + for (; q != end; ++q) { + toclevel = q->layout()->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC + && toclevel <= thistoclevel) { + break; + } + } + pit_type const newpit = std::distance(pars.begin(), q); + pit_type const len = std::distance(s, p); + pars.insert(q, s, p); + s = boost::next(pars.begin(), pit); + ParagraphList::iterator t = boost::next(s, len); + pit = newpit - len; + pars.erase(s, t); + break; + } + case In: + for (; lit != lend; ++lit) { + if ((*lit)->toclevel == thistoclevel + 1) { + s->layout((*lit)); + break; + } + } + break; + case Out: + for (; lit != lend; ++lit) { + if ((*lit)->toclevel == thistoclevel - 1) { + s->layout((*lit)); + break; + } + } + break; + default: + break; + } +} + + } // namespace toc } // namespace lyx Index: toc.h =================================================================== --- toc.h (revision 13690) +++ toc.h (working copy) @@ -20,6 +20,8 @@ #include <vector> #include <string> +#include "pariterator.h" + class Buffer; class LyXView; class Paragraph; @@ -84,6 +86,18 @@ bool operator!=(TocItem const & a, TocIt } +/// the type of outline operation +enum OutlineOp { + Up, // Move this header with text down + Down, // Move this header with text up + In, // Make this header deeper + Out // Make this header shallower +}; + + +void outline(OutlineOp, Buffer *, pit_type &); + + } // namespace toc } // namespace lyx
signature.asc
Description: This is a digitally signed message part