]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
The "I want this in now" patch.
[lyx.git] / src / text2.C
index 83bec0feda471cba5f9d2ee8fa00155fdd3a4115..b34bc99063387b290b7db708cca0ebeefd0ff9ba 100644 (file)
 
 #include "lyxtext.h"
 #include "LString.h"
+#include "Lsstream.h"
 #include "paragraph.h"
+#include "funcrequest.h"
 #include "frontends/LyXView.h"
 #include "undo_funcs.h"
 #include "buffer.h"
 #include "bufferparams.h"
+#include "errorlist.h"
 #include "gettext.h"
 #include "BufferView.h"
 #include "CutAndPaste.h"
 #include "paragraph_funcs.h"
 
 #include "insets/insetbibitem.h"
+#include "insets/insetenv.h"
 #include "insets/insetfloat.h"
+#include "insets/insetwrap.h"
 
 #include "support/LAssert.h"
 #include "support/textutils.h"
 #include "support/lstrings.h"
 
-#include "support/BoostFormat.h"
 #include <boost/tuple/tuple.hpp>
 
 using std::vector;
@@ -423,22 +427,41 @@ LyXText::setLayout(LyXCursor & cur, LyXCursor & sstart_cur,
 // set layout over selection and make a total rebreak of those paragraphs
 void LyXText::setLayout(string const & layout)
 {
-       LyXCursor tmpcursor = cursor;  /* store the current cursor  */
+       LyXCursor tmpcursor = cursor;  // store the current cursor
 
        // if there is no selection just set the layout
-       // of the current paragraph  */
+       // of the current paragraph
        if (!selection.set()) {
                selection.start = cursor;  // dummy selection
                selection.end = cursor;
        }
+
+       // special handling of new environment insets
+       BufferParams const & params = bv()->buffer()->params;
+       LyXLayout_ptr const & lyxlayout = params.getLyXTextClass()[layout];
+       if (lyxlayout->is_environment) {
+               // move everything in a new environment inset
+               lyxerr << "setting layout " << layout << endl;
+               bv()->owner()->dispatch(FuncRequest(LFUN_HOME));
+               bv()->owner()->dispatch(FuncRequest(LFUN_ENDSEL));
+               bv()->owner()->dispatch(FuncRequest(LFUN_CUT));
+               Inset * inset = new InsetEnvironment(params, layout);
+               if (bv()->insertInset(inset)) {
+                       //inset->edit(bv());
+                       //bv()->owner()->dispatch(FuncRequest(LFUN_PASTE));
+               }
+               else
+                       delete inset;
+               return;
+       }
+
        ParagraphList::iterator endpit = setLayout(cursor, selection.start,
                                                   selection.end, layout);
        redoParagraphs(selection.start, endpit);
 
        // we have to reset the selection, because the
        // geometry could have changed
-       setCursor(selection.start.par(),
-                 selection.start.pos(), false);
+       setCursor(selection.start.par(), selection.start.pos(), false);
        selection.cursor = cursor;
        setCursor(selection.end.par(), selection.end.pos(), false);
        updateCounters();
@@ -504,10 +527,10 @@ bool LyXText::changeDepth(bv_funcs::DEPTH_CHANGE type, bool test_only)
 
        // Wow, redoParagraphs is stupid.
        LyXCursor tmpcursor;
-       setCursor(tmpcursor, &(*start), 0);
+       setCursor(tmpcursor, start, 0);
 
        //redoParagraphs(tmpcursor, &(*pastend));
-       redoParagraphs(tmpcursor, &(*pastend));
+       redoParagraphs(tmpcursor, pastend);
 
        // We need to actually move the text->cursor. I don't
        // understand why ...
@@ -963,7 +986,7 @@ void LyXText::setParagraph(bool line_top, bool line_bottom,
                        ++endpit;
                        undoendpit = endpit;
                }
-       } else if (endpit!= pars_end) {
+       } else if (endpit != pars_end) {
                // because of parindents etc.
                ++endpit;
        }
@@ -1173,23 +1196,21 @@ void LyXText::setCounter(Buffer const * buf, ParagraphList::iterator pit)
                        }
 
                        if (isOK) {
-                               Floating const & fl
-                                       = textclass.floats().getType(static_cast<InsetFloat*>(in)->type());
+                               string type;
+
+                               if (in->lyxCode() == Inset::FLOAT_CODE)
+                                       type = static_cast<InsetFloat*>(in)->params().type;
+                               else if (in->lyxCode() == Inset::WRAP_CODE)
+                                       type = static_cast<InsetWrap*>(in)->params().type;
+                               else
+                                       lyx::Assert(0);
+
+                               Floating const & fl = textclass.floats().getType(type);
 
                                textclass.counters().step(fl.type());
 
                                // Doesn't work... yet.
-#if USE_BOOST_FORMAT
-                               s = boost::io::str(boost::format(_("%1$s #:")) % buf->B_(fl.name()));
-                               // s << boost::format(_("%1$s %1$d:")
-                               //        % fl.name()
-                               //        % buf->counters().value(fl.name());
-#else
-                               ostringstream o;
-                               //o << fl.name() << ' ' << buf->counters().value(fl.name()) << ":";
-                               o << buf->B_(fl.name()) << " #:";
-                               s = STRCONV(o.str());
-#endif
+                               s = bformat(_("%1$s #:"), buf->B_(fl.name()));
                        } else {
                                // par->SetLayout(0);
                                // s = layout->labelstring;
@@ -1231,7 +1252,7 @@ void LyXText::updateCounters()
 
                string const oldLabel = pit->params().labelString();
 
-               int maxdepth = 0;
+               size_t maxdepth = 0;
                if (pit != ownerParagraphs().begin())
                        maxdepth = boost::prior(pit)->getMaxDepthAfter();
 
@@ -1314,7 +1335,7 @@ void LyXText::cutSelection(bool doclear, bool realcut)
        endpit = selection.end.par();
        int endpos = selection.end.pos();
 
-       boost::tie(endpit, endpos) = realcut ? 
+       boost::tie(endpit, endpos) = realcut ?
                CutAndPaste::cutSelection(ownerParagraphs(),
                                          selection.start.par(), endpit,
                                          selection.start.pos(), endpos,
@@ -1367,8 +1388,8 @@ void LyXText::copySelection()
                   || selection.start.pos() < selection.end.pos()))
                selection.start.pos(selection.start.pos() + 1);
 
-       CutAndPaste::copySelection(&*selection.start.par(),
-                                  &*selection.end.par(),
+       CutAndPaste::copySelection(selection.start.par(),
+                                  selection.end.par(),
                                   selection.start.pos(), selection.end.pos(),
                                   bv()->buffer()->params.textclass);
 }
@@ -1383,21 +1404,26 @@ void LyXText::pasteSelection()
        setUndo(bv(), Undo::INSERT,
                cursor.par(), boost::next(cursor.par()));
 
-       Paragraph * endpar;
-       ParagraphList::iterator actpit = cursor.par();
-       int pos = cursor.pos();
+       ParagraphList::iterator endpit;
+       PitPosPair ppp;
 
-       Paragraph * actpar = &*actpit;
-       CutAndPaste::pasteSelection(&actpar, &endpar, pos,
-                                   bv()->buffer()->params.textclass);
+       ErrorList el;
 
-       redoParagraphs(cursor, endpar);
+       boost::tie(ppp, endpit) =
+               CutAndPaste::pasteSelection(ownerParagraphs(),
+                                           cursor.par(), cursor.pos(),
+                                           bv()->buffer()->params.textclass,
+                                           el);
+       bv()->setErrorList(el);
+       bv()->showErrorList(_("Paste"));
+
+       redoParagraphs(cursor, endpit);
 
        setCursor(cursor.par(), cursor.pos());
        clearSelection();
 
        selection.cursor = cursor;
-       setCursor(actpit, pos);
+       setCursor(ppp.first, ppp.second);
        setSelection();
        updateCounters();
 }
@@ -1626,10 +1652,10 @@ void LyXText::setCursor(LyXCursor & cur, ParagraphList::iterator pit,
        // same paragraph and there is a previous row then put the cursor on
        // the end of the previous row
        cur.iy(y + row->baseline());
-       if (row != beg && 
-           pos && 
-           boost::prior(row)->par() == row->par() && 
-           pos < pit->size() && 
+       if (row != beg &&
+           pos &&
+           boost::prior(row)->par() == row->par() &&
+           pos < pit->size() &&
            pit->getChar(pos) == Paragraph::META_INSET) {
                Inset * ins = pit->getInset(pos);
                if (ins && (ins->needFullRow() || ins->display())) {
@@ -1637,7 +1663,7 @@ void LyXText::setCursor(LyXCursor & cur, ParagraphList::iterator pit,
                        y -= row->height();
                }
        }
-       
+
        cur.row(row);
        // y is now the beginning of the cursor row
        y += row->baseline();
@@ -1863,7 +1889,7 @@ LyXText::getColumnNearX(RowList::iterator rit, int & x, bool & boundary) const
                if (body_pos > 0 && c == body_pos - 1) {
                        tmpx += fill_label_hfill +
                                font_metrics::width(layout->labelsep,
-                                              getLabelFont(bv()->buffer(), &*rit_par));
+                                              getLabelFont(bv()->buffer(), rit_par));
                        if (rit_par->isLineSeparator(body_pos - 1))
                                tmpx -= singleWidth(rit_par, body_pos - 1);
                }
@@ -2046,7 +2072,8 @@ void LyXText::cursorUp(bool selecting)
                y -= topy;
                Inset * inset_hit = checkInsetHit(x, y1);
                if (inset_hit && isHighlyEditableInset(inset_hit)) {
-                       inset_hit->edit(bv(), x, y - (y2 - y1), mouse_button::none);
+                       inset_hit->localDispatch(
+                               FuncRequest(bv(), LFUN_INSET_EDIT, x, y - (y2 - y1), mouse_button::none));
                }
        }
 #else
@@ -2070,7 +2097,8 @@ void LyXText::cursorDown(bool selecting)
                y -= topy;
                Inset * inset_hit = checkInsetHit(x, y1);
                if (inset_hit && isHighlyEditableInset(inset_hit)) {
-                       inset_hit->edit(bv(), x, y - (y2 - y1), mouse_button::none);
+                       FuncRequest cmd(bv(), LFUN_INSET_EDIT, x, y - (y2 - y1), mouse_button::none);
+                       inset_hit->localDispatch(cmd);
                }
        }
 #else