mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-09 18:31:04 +00:00
Add outlining functionality to the TOC dialog.
* LyXAction.C (LyXAction::init): define command * BufferView_pimpl.C (BufferView::Pimpl::getStatus): (BufferView::Pimpl::dispatch): add handling code * frontends/qt2/QTocDialog.C: add connections, adapters * frontends/qt2/ui/QTocDialogBase.ui: add pushbuttons * frontends/qt2/QTocDialog.h: add adapters * frontends/qt2/QToc.[Ch] (QToc::updateToc): (QToc::select): add code for TOC window positioning, and outlining methods * frontends/controllers/ControlToc.[Ch]: implement methods * lfuns.h (kb_action {): define LFUN * toc.[Ch]: implement up, down, in and out operations in Outline method git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@13521 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
fc7f2d9805
commit
c0b204c0a8
@ -49,6 +49,7 @@
|
|||||||
#include "ParagraphParameters.h"
|
#include "ParagraphParameters.h"
|
||||||
#include "pariterator.h"
|
#include "pariterator.h"
|
||||||
#include "rowpainter.h"
|
#include "rowpainter.h"
|
||||||
|
#include "toc.h"
|
||||||
#include "undo.h"
|
#include "undo.h"
|
||||||
#include "vspace.h"
|
#include "vspace.h"
|
||||||
|
|
||||||
@ -1042,6 +1043,7 @@ FuncStatus BufferView::Pimpl::getStatus(FuncRequest const & cmd)
|
|||||||
case LFUN_INSERT_LABEL:
|
case LFUN_INSERT_LABEL:
|
||||||
case LFUN_BOOKMARK_SAVE:
|
case LFUN_BOOKMARK_SAVE:
|
||||||
case LFUN_GOTO_PARAGRAPH:
|
case LFUN_GOTO_PARAGRAPH:
|
||||||
|
case LFUN_OUTLINE:
|
||||||
case LFUN_GOTOERROR:
|
case LFUN_GOTOERROR:
|
||||||
case LFUN_GOTONOTE:
|
case LFUN_GOTONOTE:
|
||||||
case LFUN_REFERENCE_GOTO:
|
case LFUN_REFERENCE_GOTO:
|
||||||
@ -1197,6 +1199,16 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd)
|
|||||||
break;
|
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:
|
case LFUN_GOTOERROR:
|
||||||
bv_funcs::gotoInset(bv_, InsetBase::ERROR_CODE, false);
|
bv_funcs::gotoInset(bv_, InsetBase::ERROR_CODE, false);
|
||||||
break;
|
break;
|
||||||
|
@ -240,6 +240,7 @@ void LyXAction::init()
|
|||||||
{ LFUN_DOWN_PARAGRAPH, "paragraph-down", ReadOnly | NoUpdate},
|
{ LFUN_DOWN_PARAGRAPH, "paragraph-down", ReadOnly | NoUpdate},
|
||||||
{ LFUN_DOWN_PARAGRAPHSEL, "paragraph-down-select", ReadOnly },
|
{ LFUN_DOWN_PARAGRAPHSEL, "paragraph-down-select", ReadOnly },
|
||||||
{ LFUN_GOTO_PARAGRAPH, "paragraph-goto", ReadOnly },
|
{ LFUN_GOTO_PARAGRAPH, "paragraph-goto", ReadOnly },
|
||||||
|
{ LFUN_OUTLINE, "outline", ReadOnly },
|
||||||
{ LFUN_PARAGRAPH_SPACING, "paragraph-spacing", Noop },
|
{ LFUN_PARAGRAPH_SPACING, "paragraph-spacing", Noop },
|
||||||
{ LFUN_UP_PARAGRAPH, "paragraph-up", ReadOnly | NoUpdate},
|
{ LFUN_UP_PARAGRAPH, "paragraph-up", ReadOnly | NoUpdate},
|
||||||
{ LFUN_UP_PARAGRAPHSEL, "paragraph-up-select", ReadOnly },
|
{ LFUN_UP_PARAGRAPHSEL, "paragraph-up-select", ReadOnly },
|
||||||
|
@ -8,9 +8,12 @@
|
|||||||
* Full author contact details are available in file CREDITS.
|
* Full author contact details are available in file CREDITS.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include "ControlToc.h"
|
#include "ControlToc.h"
|
||||||
|
#include "funcrequest.h"
|
||||||
#include "gettext.h"
|
#include "gettext.h"
|
||||||
|
|
||||||
using std::vector;
|
using std::vector;
|
||||||
@ -34,6 +37,14 @@ void ControlToc::goTo(toc::TocItem const & item)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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
|
vector<string> const ControlToc::getTypes() const
|
||||||
{
|
{
|
||||||
return toc::getTypes(kernel().buffer());
|
return toc::getTypes(kernel().buffer());
|
||||||
|
@ -38,6 +38,9 @@ public:
|
|||||||
|
|
||||||
/// Given a type, returns the contents
|
/// Given a type, returns the contents
|
||||||
toc::Toc const getContents(std::string const & type) const;
|
toc::Toc const getContents(std::string const & type) const;
|
||||||
|
|
||||||
|
/// Apply the selected outlining operation
|
||||||
|
void outline(toc::OutlineOp op);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace frontend
|
} // namespace frontend
|
||||||
|
@ -107,7 +107,9 @@ void QToc::updateToc(int newdepth)
|
|||||||
QListViewItem * last = 0;
|
QListViewItem * last = 0;
|
||||||
QListViewItem * parent = 0;
|
QListViewItem * parent = 0;
|
||||||
QListViewItem * item;
|
QListViewItem * item;
|
||||||
|
QListViewItem * selected_item = 0;
|
||||||
|
bool multiple = false;
|
||||||
|
|
||||||
// Yes, it is this ugly. Two reasons - root items must have
|
// Yes, it is this ugly. Two reasons - root items must have
|
||||||
// a QListView parent, rather than QListViewItem; and the
|
// a QListView parent, rather than QListViewItem; and the
|
||||||
// TOC can move in and out an arbitrary number of levels
|
// 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_);
|
item->setOpen(iter->depth < depth_);
|
||||||
curdepth = iter->depth;
|
curdepth = iter->depth;
|
||||||
last = item;
|
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->setUpdatesEnabled(true);
|
||||||
dialog_->tocLV->update();
|
dialog_->tocLV->update();
|
||||||
|
if (!multiple) {
|
||||||
|
dialog_->tocLV->ensureItemVisible(selected_item);
|
||||||
|
dialog_->tocLV->setSelected(selected_item, true);
|
||||||
|
dialog_->tocLV->scrollBy(0, dialog_->tocLV->height() / 2);
|
||||||
|
}
|
||||||
setTitle(fromqstr(dialog_->typeCO->currentText()));
|
setTitle(fromqstr(dialog_->typeCO->currentText()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,6 +196,8 @@ void QToc::select(string const & text)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lop off counter part and save:
|
||||||
|
text_ = text.substr(text.find(' ') + 1);
|
||||||
controller().goTo(*iter);
|
controller().goTo(*iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,5 +208,34 @@ void QToc::set_depth(int depth)
|
|||||||
updateToc(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 frontend
|
||||||
} // namespace lyx
|
} // namespace lyx
|
||||||
|
@ -42,6 +42,15 @@ private:
|
|||||||
/// set the depth
|
/// set the depth
|
||||||
void set_depth(int 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() {}
|
virtual void apply() {}
|
||||||
|
|
||||||
/// update dialog
|
/// update dialog
|
||||||
@ -55,6 +64,9 @@ private:
|
|||||||
|
|
||||||
/// depth of list shown
|
/// depth of list shown
|
||||||
int depth_;
|
int depth_;
|
||||||
|
|
||||||
|
/// Store selected item's string
|
||||||
|
std::string text_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace frontend
|
} // namespace frontend
|
||||||
|
@ -32,8 +32,11 @@ QTocDialog::QTocDialog(QToc * form)
|
|||||||
if (w)
|
if (w)
|
||||||
w->hide();
|
w->hide();
|
||||||
|
|
||||||
connect(closePB, SIGNAL(clicked()),
|
connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose()));
|
||||||
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)
|
void QTocDialog::closeEvent(QCloseEvent * e)
|
||||||
{
|
{
|
||||||
form_->slotWMHide();
|
form_->slotWMHide();
|
||||||
|
@ -29,6 +29,10 @@ public slots:
|
|||||||
void depth_adaptor(int);
|
void depth_adaptor(int);
|
||||||
void select_adaptor(QListViewItem *);
|
void select_adaptor(QListViewItem *);
|
||||||
void update_adaptor();
|
void update_adaptor();
|
||||||
|
void moveup_adaptor();
|
||||||
|
void movedn_adaptor();
|
||||||
|
void movein_adaptor();
|
||||||
|
void moveout_adaptor();
|
||||||
protected:
|
protected:
|
||||||
void closeEvent(QCloseEvent * e);
|
void closeEvent(QCloseEvent * e);
|
||||||
private:
|
private:
|
||||||
|
@ -171,6 +171,50 @@
|
|||||||
<string>&Update</string>
|
<string>&Update</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</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>Dn</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>
|
<spacer>
|
||||||
<property>
|
<property>
|
||||||
<name>name</name>
|
<name>name</name>
|
||||||
|
@ -357,6 +357,7 @@ enum kb_action {
|
|||||||
LFUN_BIBDB_ADD,
|
LFUN_BIBDB_ADD,
|
||||||
LFUN_BIBDB_DEL,
|
LFUN_BIBDB_DEL,
|
||||||
LFUN_INSERT_CITATION,
|
LFUN_INSERT_CITATION,
|
||||||
|
LFUN_OUTLINE, // Vermeer 20060323
|
||||||
|
|
||||||
LFUN_LASTACTION // end of the table
|
LFUN_LASTACTION // end of the table
|
||||||
};
|
};
|
||||||
|
102
src/toc.C
102
src/toc.C
@ -19,7 +19,6 @@
|
|||||||
#include "funcrequest.h"
|
#include "funcrequest.h"
|
||||||
#include "LyXAction.h"
|
#include "LyXAction.h"
|
||||||
#include "paragraph.h"
|
#include "paragraph.h"
|
||||||
#include "pariterator.h"
|
|
||||||
|
|
||||||
#include "frontends/LyXView.h"
|
#include "frontends/LyXView.h"
|
||||||
|
|
||||||
@ -167,5 +166,106 @@ void asciiTocList(string const & type, Buffer const & buffer, ostream & os)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 toc
|
||||||
} // namespace lyx
|
} // namespace lyx
|
||||||
|
14
src/toc.h
14
src/toc.h
@ -20,6 +20,8 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "pariterator.h"
|
||||||
|
|
||||||
class Buffer;
|
class Buffer;
|
||||||
class LyXView;
|
class LyXView;
|
||||||
class Paragraph;
|
class Paragraph;
|
||||||
@ -84,6 +86,18 @@ bool operator!=(TocItem const & a, TocItem const & b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// 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 toc
|
||||||
} // namespace lyx
|
} // namespace lyx
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user