On Fri, Aug 25, 2006 at 05:05:04PM +0200, Jean-Marc Lasgouttes wrote: > > We have come a long way towards 1.4.3, so now is the time to think > about a release. I will be in vacation again next week, so the date > should be some time at the beginning of September. > > Things that I expect to be done for 1.4.3:
... > Something that I am not sure yet of is the outline features from > Martin. Martin, you promised us a patch... The situation is that we > have enough done to warrant a 1.4.3 without outline, so we can choose > to be careful and do small steps. Here it is. Works for me, as well it seems as way back when. (Has this been tested well enough, e.g., on Windows?) - Martin PS I'll be away next week.
Index: LyXAction.C
===================================================================
--- LyXAction.C (revision 14840)
+++ LyXAction.C (working copy)
@@ -241,6 +241,10 @@
{ LFUN_DOWN_PARAGRAPH, "paragraph-down", ReadOnly | NoUpdate},
{ LFUN_DOWN_PARAGRAPHSEL, "paragraph-down-select", ReadOnly },
{ LFUN_GOTO_PARAGRAPH, "paragraph-goto", ReadOnly },
+ { LFUN_OUTLINE_UP, "outline-up", Noop },
+ { LFUN_OUTLINE_DOWN, "outline-down", Noop },
+ { LFUN_OUTLINE_IN, "outline-in", Noop },
+ { LFUN_OUTLINE_OUT, "outline-out", Noop },
{ 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 14840)
+++ 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"
@@ -1046,6 +1047,11 @@
case LFUN_FONT_STATE:
case LFUN_INSERT_LABEL:
case LFUN_GOTO_PARAGRAPH:
+ // FIXME handle non-trivially
+ case LFUN_OUTLINE_UP:
+ case LFUN_OUTLINE_DOWN:
+ case LFUN_OUTLINE_IN:
+ case LFUN_OUTLINE_OUT:
case LFUN_GOTONOTE:
case LFUN_REFERENCE_GOTO:
case LFUN_WORD_FIND:
@@ -1207,6 +1213,25 @@
break;
}
+ case LFUN_OUTLINE_UP:
+ lyx::toc::outline(lyx::toc::Up, cursor_);
+ cursor_.text()->setCursor(cursor_, cursor_.pit(), 0);
+ updateCounters(*buffer_);
+ break;
+ case LFUN_OUTLINE_DOWN:
+ lyx::toc::outline(lyx::toc::Down, cursor_);
+ cursor_.text()->setCursor(cursor_, cursor_.pit(), 0);
+ updateCounters(*buffer_);
+ break;
+ case LFUN_OUTLINE_IN:
+ lyx::toc::outline(lyx::toc::In, cursor_);
+ updateCounters(*buffer_);
+ break;
+ case LFUN_OUTLINE_OUT:
+ lyx::toc::outline(lyx::toc::Out, cursor_);
+ updateCounters(*buffer_);
+ break;
+
case LFUN_GOTONOTE:
bv_funcs::gotoInset(bv_, InsetBase::NOTE_CODE, false);
break;
Index: frontends/qt2/QTocDialog.C
===================================================================
--- frontends/qt2/QTocDialog.C (revision 14840)
+++ frontends/qt2/QTocDialog.C (working copy)
@@ -32,8 +32,11 @@
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()));
}
@@ -60,12 +63,50 @@
}
+void QTocDialog::enableButtons(bool enable)
+{
+ updatePB->setEnabled(enable);
+
+ if (!form_->canOutline())
+ enable = false;
+
+ moveupPB->setEnabled(enable);
+ movednPB->setEnabled(enable);
+ moveinPB->setEnabled(enable);
+ moveoutPB->setEnabled(enable);
+}
+
+
void QTocDialog::update_adaptor()
{
form_->update();
}
+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 14840)
+++ frontends/qt2/ui/QTocDialogBase.ui (working copy)
@@ -168,9 +168,53 @@
</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>
<property>
<name>name</name>
Index: frontends/qt2/QTocDialog.h
===================================================================
--- frontends/qt2/QTocDialog.h (revision 14840)
+++ frontends/qt2/QTocDialog.h (working copy)
@@ -24,11 +24,17 @@
public:
QTocDialog(QToc * form);
~QTocDialog();
+ ///
+ void enableButtons(bool enable = true);
public slots:
void activate_adaptor(int);
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 14840)
+++ frontends/qt2/QToc.C (working copy)
@@ -48,6 +48,8 @@
// Manage the cancel/close button
bcview().setCancel(dialog_->closePB);
+ type_ = toc::getType(controller().params().getCmdName());
+ dialog_->enableButtons();
}
@@ -67,6 +69,8 @@
setTitle(guiname);
}
}
+ type_ = type;
+ dialog_->enableButtons();
}
@@ -83,6 +87,8 @@
string type;
if (!choice.empty())
type = choice[dialog_->typeCO->currentItem()];
+ type_ = type;
+ dialog_->enableButtons();
toc::Toc const & contents = controller().getContents(type);
@@ -107,7 +113,9 @@
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,14 +165,34 @@
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()));
}
+bool QToc::canOutline()
+{
+ return controller().canOutline(type_);
+}
+
+
void QToc::select(string const & text)
{
toc::Toc::const_iterator iter = toclist.begin();
@@ -180,6 +208,8 @@
return;
}
+ // Lop off counter part and save:
+ text_ = text.substr(text.find(' ') + 1);
controller().goTo(*iter);
}
@@ -190,5 +220,34 @@
updateToc(depth);
}
+
+void QToc::moveup()
+{
+ controller().outline(toc::Up);
+ updateToc(depth_);
+}
+
+
+void QToc::movedn()
+{
+ controller().outline(toc::Down);
+ updateToc(depth_);
+}
+
+
+void QToc::movein()
+{
+ controller().outline(toc::In);
+ updateToc(depth_);
+}
+
+
+void QToc::moveout()
+{
+ controller().outline(toc::Out);
+ updateToc(depth_);
+}
+
+
} // namespace frontend
} // namespace lyx
Index: frontends/qt2/QToc.h
===================================================================
--- frontends/qt2/QToc.h (revision 14840)
+++ frontends/qt2/QToc.h (working copy)
@@ -33,6 +33,9 @@
/// update the listview
void updateToc(int newdepth);
+ ///
+ bool canOutline();
+
/// update the float types
void updateType();
@@ -42,6 +45,15 @@
/// 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 +67,12 @@
/// depth of list shown
int depth_;
+
+ /// Store selected item's string
+ std::string text_;
+
+ /// Store ToC list type
+ std::string type_;
};
} // namespace frontend
Index: frontends/controllers/ControlToc.C
===================================================================
--- frontends/controllers/ControlToc.C (revision 14840)
+++ 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,31 @@
}
+bool ControlToc::canOutline(string const & type)
+{
+ return type == "TOC";
+}
+
+
+void ControlToc::outline(toc::OutlineOp op)
+{
+ switch (op) {
+ case toc::Up:
+ kernel().dispatch(FuncRequest(LFUN_OUTLINE_UP));
+ break;
+ case toc::Down:
+ kernel().dispatch(FuncRequest(LFUN_OUTLINE_DOWN));
+ break;
+ case toc::In:
+ kernel().dispatch(FuncRequest(LFUN_OUTLINE_IN));
+ break;
+ case toc::Out:
+ kernel().dispatch(FuncRequest(LFUN_OUTLINE_OUT));
+ break;
+ }
+}
+
+
vector<string> const ControlToc::getTypes() const
{
return toc::getTypes(kernel().buffer());
Index: frontends/controllers/ControlToc.h
===================================================================
--- frontends/controllers/ControlToc.h (revision 14840)
+++ frontends/controllers/ControlToc.h (working copy)
@@ -38,6 +38,12 @@
/// 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);
+
+ /// Test if outlining operation is possible
+ bool canOutline(std::string const & type);
};
} // namespace frontend
Index: lfuns.h
===================================================================
--- lfuns.h (revision 14840)
+++ lfuns.h (working copy)
@@ -357,6 +357,11 @@
LFUN_BIBDB_ADD,
LFUN_BIBDB_DEL,
LFUN_INSERT_CITATION,
+ LFUN_OUTLINE_UP, // Vermeer 20060323
+ // 275
+ LFUN_OUTLINE_DOWN,
+ LFUN_OUTLINE_IN,
+ LFUN_OUTLINE_OUT,
LFUN_TOGGLE_COMPRESSION, // bpeng 20060427
LFUN_LASTACTION // end of the table
Index: toc.C
===================================================================
--- toc.C (revision 14840)
+++ toc.C (working copy)
@@ -15,11 +15,12 @@
#include "buffer.h"
#include "bufferparams.h"
+#include "cursor.h"
#include "FloatList.h"
#include "funcrequest.h"
#include "LyXAction.h"
#include "paragraph.h"
-#include "pariterator.h"
+#include "undo.h"
#include "frontends/LyXView.h"
@@ -167,5 +168,111 @@
}
+void outline(OutlineOp mode, LCursor & cur)
+{
+ recordUndo(cur);
+ Buffer * buf = & cur.buffer();
+ pit_type & pit = cur.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()->labeltype ==
(*lit)->labeltype) {
+ s->layout((*lit));
+ break;
+ }
+ }
+ break;
+ case Out:
+ for (; lit != lend; ++lit) {
+ if ((*lit)->toclevel == thistoclevel - 1 &&
+ s->layout()->labeltype ==
(*lit)->labeltype) {
+ s->layout((*lit));
+ break;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+
} // namespace toc
} // namespace lyx
Index: toc.h
===================================================================
--- toc.h (revision 14840)
+++ toc.h (working copy)
@@ -20,6 +20,8 @@
#include <vector>
#include <string>
+#include "pariterator.h"
+
class Buffer;
class LyXView;
class Paragraph;
@@ -72,8 +74,7 @@
inline
bool operator==(TocItem const & a, TocItem const & b)
{
- return a.id_ == b.id_ && a.str == b.str;
- // No need to compare depth.
+ return a.id_ == b.id_ && a.str == b.str && a.depth == b.depth;
}
@@ -84,6 +85,18 @@
}
+/// 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, LCursor &);
+
+
} // namespace toc
} // namespace lyx
pgpvSKvrCVSVa.pgp
Description: PGP signature
