On Tue, 09 Oct 2007 22:57:38 +0300
Martin Vermeer <[EMAIL PROTECTED]> wrote:
> On Tue, Oct 09, 2007 at 10:47:54AM +0300, Martin Vermeer wrote:
>
> ...
>
> > Now _my_ question:
> >
> > Looking at Text3.cpp, I find the passage
> >
> > if (gotsel && pastesel) {
> > lyx::dispatch(FuncRequest(LFUN_PASTE, "0"));
> > // reset first par to default
> > if (cur.lastpit() != 0 || cur.lastpos() != 0) {
> > LayoutPtr const layout =
> >
> > cur.buffer().params().getTextClass().defaultLayout();
> >
> > cur.text()->paragraphs().begin()->layout(layout);
> > }
> > }
> >
> > If I read this correctly, what's happening is that if an inset is
> > created around selected text, and under some circumstances the first
> > paragraph inside the inset is reset to default layout.
> >
> > Now my question is, what precisely is happening here, and is this what
> > we really want? Those 'some circumstances' look suspicious.
> >
> > I am asking because we could use the multipar inset layout parameter
> > for this. Reset to default only if multipar = false, because these are
> > typically small insets embedded in a running paragraph. When selecting
> > and enclosing multiple paragraphs in an inset, I find the resetting of
> > the first paragraph often irritating.
> >
> > OTOH if the surrounding text para becomes empty after the cut, I think
> > resetting _that_ to default makes sense. Think enclosing a section
> > header plus text into a (branch) inset. Or a numbered/bullet list.
>
> The attached patch implements this (IMHO saner) behaviour.
>
> BTW the FIXME has been broken forever. As a fix, merging the paragraphs may
> produce minimum information loss for the user.
The attached fixes this too.
I'll commit this presently if I don't hear dissenting voices.
- Martin
Index: src/Text3.cpp
===================================================================
--- src/Text3.cpp (revision 20732)
+++ src/Text3.cpp (working copy)
@@ -209,11 +209,25 @@
if (gotsel && pastesel) {
lyx::dispatch(FuncRequest(LFUN_PASTE, "0"));
- // reset first par to default
- if (cur.lastpit() != 0 || cur.lastpos() != 0) {
+ InsetLayout il = inset->getLayout(cur.buffer().params());
+ if (!il.multipar || cur.lastpit() == 0) {
+ // reset first par to default
LayoutPtr const layout =
cur.buffer().params().getTextClass().defaultLayout();
cur.text()->paragraphs().begin()->layout(layout);
+ cur.pos() = 0;
+ cur.pit() = 0;
+ // Merge multiple paragraphs -- hack
+ while (cur.lastpit() > 0) {
+ mergeParagraph(cur.buffer().params(),
+ cur.text()->paragraphs(), 0);
+ }
+ } else {
+ // reset surrounding par to default
+ docstring const layoutname =
+ cur.buffer().params().getTextClass().defaultLayoutName();
+ cur.leaveInset(*inset);
+ text->setLayout(cur, layoutname);
}
}
}
Index: lib/layouts/stdinsets.inc
===================================================================
--- lib/layouts/stdinsets.inc (revision 20699)
+++ lib/layouts/stdinsets.inc (working copy)
@@ -12,6 +12,7 @@
Color Red
Size Small
EndFont
+ MultiPar true
End
InsetLayout Foot
@@ -22,6 +23,7 @@
Color Green
Size Small
EndFont
+ MultiPar true
End
InsetLayout Note:Comment
@@ -33,6 +35,7 @@
Color comment
Size Small
EndFont
+ MultiPar true
End
@@ -45,6 +48,7 @@
Color note
Size Small
EndFont
+ MultiPar true
End
InsetLayout Note:Greyedout
@@ -56,6 +60,7 @@
Color greyedout
Size Small
EndFont
+ MultiPar true
End
InsetLayout Note:Framed
@@ -67,6 +72,7 @@
Color greyedout
Size Small
EndFont
+ MultiPar true
End
InsetLayout Note:Shaded
@@ -78,6 +84,7 @@
Color greyedout
Size Small
EndFont
+ MultiPar true
End
InsetLayout ERT
@@ -91,6 +98,7 @@
Color latex
Size Small
EndFont
+ MultiPar true
End
InsetLayout Branch
@@ -99,6 +107,7 @@
Color Red
Size Small
EndFont
+ MultiPar true
End
InsetLayout Index
@@ -114,5 +123,10 @@
Color Green
Size Small
EndFont
+ MultiPar false
End
+InsetLayout Box
+ MultiPar true
+End
+