]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Adjust indentation after ff42fea8.
[lyx.git] / src / Text3.cpp
index 41e47a5583616ea67c5c0edfed610c4fe17b37fc..4c99c15774707dfe432fed950f1eae836d5185d4 100644 (file)
@@ -345,8 +345,6 @@ static void outline(OutlineOp mode, Cursor & cur)
        ParagraphList::iterator finish = start;
        ParagraphList::iterator const end = pars.end();
 
-       DocumentClass const & tc = buf.params().documentClass();
-
        int const thistoclevel = buf.text().getTocLevel(distance(bgn, start));
        int toclevel;
 
@@ -409,18 +407,25 @@ static void outline(OutlineOp mode, Cursor & cur)
                        cur.pit() = newpit - len;
                        break;
                }
-               case OutlineIn: {
+               case OutlineIn:
+               case OutlineOut: {
                        pit_type const len = distance(start, finish);
                        buf.undo().recordUndo(cur, ATOMIC_UNDO, pit, pit + len - 1);
                        for (; start != finish; ++start) {
                                toclevel = buf.text().getTocLevel(distance(bgn, start));
                                if (toclevel == Layout::NOT_IN_TOC)
                                        continue;
+
+                               DocumentClass const & tc = buf.params().documentClass();
                                DocumentClass::const_iterator lit = tc.begin();
                                DocumentClass::const_iterator len = tc.end();
+                               int const newtoclevel = 
+                                       (mode == OutlineIn ? toclevel + 1 : toclevel - 1);
+                               LabelType const oldlabeltype = start->layout().labeltype;
+
                                for (; lit != len; ++lit) {
-                                       if (lit->toclevel == toclevel + 1 &&
-                                           start->layout().labeltype == lit->labeltype) {
+                                       if (lit->toclevel ==  newtoclevel &&
+                                            lit->labeltype == oldlabeltype) {
                                                start->setLayout(*lit);
                                                break;
                                        }
@@ -428,25 +433,6 @@ static void outline(OutlineOp mode, Cursor & cur)
                        }
                        break;
                }
-               case OutlineOut: {
-                       pit_type const len = distance(start, finish);
-                       buf.undo().recordUndo(cur, ATOMIC_UNDO, pit, pit + len - 1);
-                       for (; start != finish; ++start) {
-                               toclevel = buf.text().getTocLevel(distance(bgn, start));
-                               if (toclevel == Layout::NOT_IN_TOC)
-                                       continue;
-                               DocumentClass::const_iterator lit = tc.begin();
-                               DocumentClass::const_iterator len = tc.end();
-                               for (; lit != len; ++lit) {
-                                       if (lit->toclevel == toclevel - 1 &&
-                                               start->layout().labeltype == lit->labeltype) {
-                                                       start->setLayout(*lit);
-                                                       break;
-                                       }
-                               }
-                       }
-                       break;
-               }
        }
 }
 
@@ -616,18 +602,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                cur.screenUpdateFlags(Update::FitCursor);
                break;
 
-       case LFUN_INSET_SELECT_ALL:
-               if (cur.depth() == 1 || !cur.selection() || !cur.selBegin().at_begin()
-                         || !cur.selEnd().at_end()) {
-                       needsUpdate |= cur.selHandle(false);
-                       needsUpdate |= cursorTop(cur);
-                       needsUpdate |= cur.selHandle(true);
-                       needsUpdate |= cursorBottom(cur);
-               } else
-                       cur.undispatched();
-               cur.screenUpdateFlags(Update::FitCursor);
-               break;
-
        case LFUN_CHAR_FORWARD:
        case LFUN_CHAR_FORWARD_SELECT:
                //LYXERR0(" LFUN_CHAR_FORWARD[SEL]:\n" << cur);
@@ -946,7 +920,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        pit_type const pit_end = cur.selEnd().pit();
                        for (pit_type pit = cur.selBegin().pit(); pit <= pit_end; pit++) {
                                pars_[pit].insertChar(0, '\t',
-                                                     bv->buffer().params().trackChanges);
+                                                     bv->buffer().params().track_changes);
                                // Update the selection pos to make sure the selection does not
                                // change as the inserted tab will increase the logical pos.
                                if (cur.realAnchor().pit() == pit)
@@ -965,7 +939,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_TAB_DELETE: {
-               bool const tc = bv->buffer().params().trackChanges;
+               bool const tc = bv->buffer().params().track_changes;
                if (cur.selection()) {
                        // If there is a selection, a tab (if present) is removed from
                        // the beginning of each paragraph.
@@ -1021,11 +995,20 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_CHAR_DELETE_FORWARD:
                if (!cur.selection()) {
+                       bool was_separator = cur.paragraph().isEnvSeparator(cur.pos());
                        if (cur.pos() == cur.paragraph().size())
                                // Par boundary, force full-screen update
                                singleParUpdate = false;
                        needsUpdate |= erase(cur);
                        cur.resetAnchor();
+                       if (was_separator && cur.pos() == cur.paragraph().size()
+                           && (!cur.paragraph().layout().isEnvironment()
+                               || cur.paragraph().size() > 0)) {
+                               // Force full-screen update
+                               singleParUpdate = false;
+                               needsUpdate |= erase(cur);
+                               cur.resetAnchor();
+                       }
                        // It is possible to make it a lot faster still
                        // just comment out the line below...
                } else {
@@ -1038,11 +1021,17 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_CHAR_DELETE_BACKWARD:
                if (!cur.selection()) {
                        if (bv->getIntl().getTransManager().backspace()) {
+                               bool par_boundary = cur.pos() == 0;
                                // Par boundary, full-screen update
-                               if (cur.pos() == 0)
+                               if (par_boundary)
                                        singleParUpdate = false;
                                needsUpdate |= backspace(cur);
                                cur.resetAnchor();
+                               if (par_boundary && cur.pos() > 0
+                                   && cur.paragraph().isEnvSeparator(cur.pos() - 1)) {
+                                       needsUpdate |= backspace(cur);
+                                       cur.resetAnchor();
+                               }
                                // It is possible to make it a lot faster still
                                // just comment out the line below...
                        }
@@ -1052,11 +1041,42 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                }
                break;
 
-       case LFUN_PARAGRAPH_BREAK:
+       case LFUN_PARAGRAPH_BREAK: {
                cap::replaceSelection(cur);
-               breakParagraph(cur, cmd.argument() == "inverse");
+               pit_type pit = cur.pit();
+               Paragraph const & par = pars_[pit];
+               pit_type prev = pit;
+               if (pit > 0) {
+                       if (!pars_[pit - 1].layout().isEnvironment())
+                               prev = depthHook(pit, par.getDepth());
+                       else if (pars_[pit - 1].getDepth() >= par.getDepth())
+                               prev = pit - 1;
+               }
+               if (prev < pit && cur.pos() == par.beginOfBody()
+                   && !par.isEnvSeparator(cur.pos())
+                   && !par.layout().isCommand()
+                   && pars_[prev].layout() != par.layout()
+                   && pars_[prev].layout().isEnvironment()) {
+                       if (par.layout().isEnvironment()
+                           && pars_[prev].getDepth() == par.getDepth()) {
+                               docstring const layout = par.layout().name();
+                               DocumentClass const & tc = bv->buffer().params().documentClass();
+                               lyx::dispatch(FuncRequest(LFUN_LAYOUT, tc.plainLayout().name()));
+                               lyx::dispatch(FuncRequest(LFUN_SEPARATOR_INSERT, "parbreak"));
+                               lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK, "inverse"));
+                               lyx::dispatch(FuncRequest(LFUN_LAYOUT, layout));
+                       } else {
+                               lyx::dispatch(FuncRequest(LFUN_SEPARATOR_INSERT, "parbreak"));
+                               breakParagraph(cur);
+                       }
+                       Font const f(inherit_font, cur.current_font.language());
+                       pars_[cur.pit() - 1].resetFonts(f);
+               } else {
+                       breakParagraph(cur, cmd.argument() == "inverse");
+               }
                cur.resetAnchor();
                break;
+       }
 
        case LFUN_INSET_INSERT: {
                cur.recordUndo();
@@ -1404,15 +1424,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        while (cur.paragraph().params().depth() > split_depth)
                                lyx::dispatch(FuncRequest(LFUN_DEPTH_DECREMENT));
                }
-               bool const morecont = cur.lastpos() > cur.pos();
-               // FIXME This hardcoding is bad
-               docstring const sep =
-                               cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator"))
-                                       ? from_ascii("Separator") : from_ascii("--Separator--");
-               lyx::dispatch(FuncRequest(LFUN_LAYOUT, sep));
+               DocumentClass const & tc = bv->buffer().params().documentClass();
+               lyx::dispatch(FuncRequest(LFUN_LAYOUT, tc.plainLayout().name()));
+               lyx::dispatch(FuncRequest(LFUN_SEPARATOR_INSERT, "plain"));
                lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK, "inverse"));
-               if (morecont)
-                       lyx::dispatch(FuncRequest(LFUN_DOWN));
                lyx::dispatch(FuncRequest(LFUN_LAYOUT, layout));
 
                break;
@@ -1514,7 +1529,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_MOUSE_DOUBLE:
                if (cmd.button() == mouse_button::button1) {
-                       selectWord(cur, WHOLE_WORD_STRICT);
+                       selectWord(cur, WHOLE_WORD);
                        bv->cursor() = cur;
                }
                break;
@@ -1903,6 +1918,16 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                cur.posForward();
                break;
 
+       case LFUN_SEPARATOR_INSERT: {
+               doInsertInset(cur, this, cmd, false, false);
+               cur.posForward();
+               // remove a following space
+               Paragraph & par = cur.paragraph();
+               if (cur.pos() != cur.lastpos() && par.isLineSeparator(cur.pos()))
+                   par.eraseChar(cur.pos(), cur.buffer()->params().track_changes);
+               break;
+       }
+
        case LFUN_DEPTH_DECREMENT:
                changeDepth(cur, DEC_DEPTH);
                break;
@@ -2357,6 +2382,33 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                needsUpdate = true;
                break;
 
+       case LFUN_SERVER_GET_STATISTICS:
+               {
+                       DocIterator from, to;
+                       if (cur.selection()) {
+                               from = cur.selectionBegin();
+                               to = cur.selectionEnd();
+                       } else {
+                               from = doc_iterator_begin(cur.buffer());
+                               to = doc_iterator_end(cur.buffer());
+                       }
+
+                       cur.buffer()->updateStatistics(from, to);
+                       string const arg0 = cmd.getArg(0);
+                       if (arg0 == "words") {
+                               cur.message(convert<docstring>(cur.buffer()->wordCount()));
+                       } else if (arg0 == "chars") {
+                               cur.message(convert<docstring>(cur.buffer()->charCount(false)));
+                       } else if (arg0 == "chars-space") {
+                               cur.message(convert<docstring>(cur.buffer()->charCount(true)));
+                       } else {
+                               cur.message(convert<docstring>(cur.buffer()->wordCount()) + " "
+                               + convert<docstring>(cur.buffer()->charCount(false)) + " "
+                               + convert<docstring>(cur.buffer()->charCount(true)));
+                       }
+               }
+               break;
+
        default:
                LYXERR(Debug::ACTION, "Command " << cmd << " not DISPATCHED by Text");
                cur.undispatched();
@@ -2580,11 +2632,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_CAPTION_INSERT: {
                code = CAPTION_CODE;
                string arg = cmd.getArg(0);
-               bool varia = arg != "LongTableNoNumber";
-               if (cur.depth() > 0) {
-                       if (&cur[cur.depth() - 1].inset())
-                               varia = cur[cur.depth() - 1].inset().allowsCaptionVariation(arg);
-               }
+               bool varia = arg != "LongTableNoNumber"
+                       && cur.inset().allowsCaptionVariation(arg);
                // not allowed in description items,
                // and in specific insets
                enable = !inDescriptionItem(cur)
@@ -2906,6 +2955,11 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        && cur.pos() > cur.paragraph().beginOfBody();
                break;
 
+       case LFUN_SEPARATOR_INSERT:
+               // Always enabled for now
+               enable = true;
+               break;
+
        case LFUN_TAB_INSERT:
        case LFUN_TAB_DELETE:
                enable = cur.paragraph().isPassThru();
@@ -2953,12 +3007,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                break;
 
        case LFUN_ENVIRONMENT_SPLIT: {
-               // FIXME This hardcoding is bad
-               if (!cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator"))
-                   && !cur.buffer()->params().documentClass().hasLayout(from_ascii("--Separator--"))) {
-                       enable = false;
-                       break;
-               }
                if (cmd.argument() == "outer") {
                        // check if we have an environment in our nesting hierarchy
                        bool res = false;
@@ -3058,7 +3106,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_INSET_END:
        case LFUN_INSET_BEGIN_SELECT:
        case LFUN_INSET_END_SELECT:
-       case LFUN_INSET_SELECT_ALL:
        case LFUN_PARAGRAPH_UP:
        case LFUN_PARAGRAPH_DOWN:
        case LFUN_LINE_BEGIN:
@@ -3076,6 +3123,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_UNICODE_INSERT:
        case LFUN_THESAURUS_ENTRY:
        case LFUN_ESCAPE:
+       case LFUN_SERVER_GET_STATISTICS:
                // these are handled in our dispatch()
                enable = true;
                break;