]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
* GuiDocument.cpp:
[lyx.git] / src / Text3.cpp
index 5121b5808a1f451a06c7e275c9cb39176ffd52df..29f1d2154f79d64cbd0e66cf156ddce4e29dce37 100644 (file)
@@ -297,6 +297,59 @@ string const freefont2string()
 }
 
 
+static void dragMove(Cursor & cur, int moveid, int movetoid)
+{
+       // Create pointers to buffers
+       Buffer & buf_move = *cur.buffer();
+       DocIterator dit_move = buf_move.getParFromID(moveid);
+       DocIterator dit_dest = buf_move.getParFromID(movetoid);
+
+       pit_type & pit_move = dit_move.pit();
+       pit_type & pit_dest = dit_dest.pit();
+       ParagraphList & pars = dit_move.text()->paragraphs();
+
+       // Create references to the paragraphs to be moved
+       ParagraphList::iterator const bgn = pars.begin();
+       ParagraphList::iterator dest_start = boost::next(bgn, pit_dest);
+
+       // The first paragraph of the area to be copied:
+       ParagraphList::iterator start = boost::next(bgn, pit_move);
+       // The final paragraph of area to be copied:
+       ParagraphList::iterator finish = start;
+       ParagraphList::iterator const end = pars.end();
+
+       // Move out (down) from this section header
+       if (finish != end)
+               ++finish;
+
+       // Seek the one (on same level) below
+       int const thistoclevel = start->layout().toclevel;
+       for (; finish != end; ++finish) {
+               int const toclevel = finish->layout().toclevel;
+               if (toclevel != Layout::NOT_IN_TOC
+                   && toclevel <= thistoclevel)
+                       break;
+       }
+
+       if (start == pars.begin() || start == dest_start)
+               // Nothing to move
+               return;
+
+       pars.insert(dest_start, start, finish);
+       pars.erase(start, finish);
+
+       // FIXME: This only really needs doing for the newly
+       // introduced paragraphs. Something like:
+       //      pit_type const numpars = distance(start, finish);
+       //      start = boost::next(bgn, pit);
+       //      finish = boost::next(start, numpars);
+       //      for (; start != finish; ++start)
+       //              start->setBuffer(buf);
+       // But while this seems to work, it is kind of fragile.
+       buf_move.inset().setBuffer(buf_move);
+}
+
+
 /// the type of outline operation
 enum OutlineOp {
        OutlineUp, // Move this header with text down
@@ -326,6 +379,7 @@ static void outline(OutlineOp mode, Cursor & cur)
        // Move out (down) from this section header
        if (finish != end)
                ++finish;
+
        // Seek the one (on same level) below
        for (; finish != end; ++finish) {
                toclevel = finish->layout().toclevel;
@@ -1630,7 +1684,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                dispatch(cur, fr);
                break;
        }
-
+       
        case LFUN_NOMENCL_PRINT:
        case LFUN_TOC_INSERT:
        case LFUN_LINE_INSERT:
@@ -2023,6 +2077,16 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                cur.buffer()->updateLabels();
                needsUpdate = true;
                break;
+       
+       case LFUN_OUTLINE_DRAGMOVE: {
+               int const move_id = convert<int>(cmd.getArg(0));
+               int const move_to_id = convert<int>(cmd.getArg(1));
+               dragMove(cur, move_id, move_to_id);
+               setCursor(cur, cur.pit(), 0);
+               cur.buffer()->updateLabels();
+               needsUpdate = true;
+               break;
+       }
 
        default:
                LYXERR(Debug::ACTION, "Command " << cmd << " not DISPATCHED by Text");
@@ -2030,6 +2094,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
+       if (lyxrc.spellcheck_continuously && cur.inTexted())
+               // Take this opportunity to spellcheck current word.
+               cur.paragraph().isMisspelled(cur.pos());
+
        needsUpdate |= (cur.pos() != cur.lastpos()) && cur.selection();
 
        // FIXME: The cursor flag is reset two lines below
@@ -2127,6 +2195,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        code = INDEX_PRINT_CODE;
                else if (cmd.argument() == "nomenclature")
                        code = NOMENCL_CODE;
+               else if (cmd.argument() == "nomencl_print")
+                       code = NOMENCL_PRINT_CODE;
                else if (cmd.argument() == "label")
                        code = LABEL_CODE;
                else if (cmd.argument() == "note")
@@ -2405,6 +2475,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_OUTLINE_DOWN:
        case LFUN_OUTLINE_IN:
        case LFUN_OUTLINE_OUT:
+       case LFUN_OUTLINE_DRAGMOVE:
                // FIXME: LyX is not ready for outlining within inset.
                enable = isMainText(cur.bv().buffer())
                        && cur.paragraph().layout().toclevel != Layout::NOT_IN_TOC;