commit 8010b90cb447ff9540823f21b49652ac462f81e1
Author: Uwe Stöhr <uwesto...@lyx.org>
Date:   Mon May 11 21:30:32 2015 +0200

    add ability to change box line thickness and separation
    
    fileformat change

diff --git a/development/FORMAT b/development/FORMAT
index a0bf4fa..058e382 100644
--- a/development/FORMAT
+++ b/development/FORMAT
@@ -11,6 +11,14 @@ adjustments are made to tex2lyx and bugs are fixed in 
lyx2lyx.
 
 -----------------------
 
+2015-05-xx Uwe Stöhr <uwesto...@web.de>
+       * Format incremented to 489: support to set line thickness, box 
separation
+             and shadow size in the box dialog 
+         New box parameters:
+         - thickness
+         - separation
+         - shadowsize
+
 2015-04-21 Jürgen Spitzmüller <sp...@lyx.org>
        * Format incremented to 488: Rewrite the Glosse insets (Glosse and 
Tri-Glosse).
           These insets now do not any longer use PassThru. Instead, they use 
an optional
diff --git a/lib/lyx2lyx/LyX.py b/lib/lyx2lyx/LyX.py
index f5e6e40..934f995 100644
--- a/lib/lyx2lyx/LyX.py
+++ b/lib/lyx2lyx/LyX.py
@@ -85,7 +85,7 @@ format_relation = [("0_06",    [200], minor_versions("0.6" , 
4)),
                    ("1_6", list(range(277,346)), minor_versions("1.6" , 10)),
                    ("2_0", list(range(346,414)), minor_versions("2.0" , 8)),
                    ("2_1", list(range(414,475)), minor_versions("2.1" , 0)),
-                   ("2_2", list(range(475,489)), minor_versions("2.2" , 0))
+                   ("2_2", list(range(475,490)), minor_versions("2.2" , 0))
                   ]
 
 ####################################################################
diff --git a/lib/lyx2lyx/lyx_2_2.py b/lib/lyx2lyx/lyx_2_2.py
index 68545dd..57324ac 100644
--- a/lib/lyx2lyx/lyx_2_2.py
+++ b/lib/lyx2lyx/lyx_2_2.py
@@ -956,6 +956,65 @@ def convert_newgloss(document):
             i = endPlain + 1
 
 
+def convert_BoxFeatures(document):
+    " adds new box features "
+
+    i = 0
+    while True:
+        i = find_token(document.body, "height_special", i)
+        if i == -1:
+            return
+        document.body.insert(i + 1, 'thickness "0.4pt"\nseparation 
"3pt"\nshadowsize "4pt"\n')
+        i = i + 1
+
+
+def revert_BoxFeatures(document):
+    " deletes new box features "
+
+    i = 0
+    defaultSep = "3pt"
+    defaultThick = "0.4pt"
+    defaultShadow = "4pt"
+    while True:
+        i = find_token(document.body, "height_special", i)
+        if i == -1:
+            return
+        # read out the values
+        beg = document.body[i+1].find('"');
+        end = document.body[i+1].rfind('"');
+        thickness = document.body[i+1][beg+1:end];
+        beg = document.body[i+2].find('"');
+        end = document.body[i+2].rfind('"');
+        separation = document.body[i+2][beg+1:end];
+        beg = document.body[i+3].find('"');
+        end = document.body[i+3].rfind('"');
+        shadowsize = document.body[i+3][beg+1:end];
+        # delete the specification
+        del document.body[i+1:i+4]
+        # output ERT
+        # first output the closing braces
+        if shadowsize != defaultShadow or separation != defaultSep or 
thickness != defaultThick:
+            document.body[i + 10 : i + 10] = put_cmd_in_ert("}")
+        # now output the lengths
+        if shadowsize != defaultShadow or separation != defaultSep or 
thickness != defaultThick:
+            document.body[i - 10 : i - 10] = put_cmd_in_ert("{")
+        if thickness != defaultThick:
+            document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + 
thickness]
+        if separation != defaultSep and thickness == defaultThick:
+            document.body[i - 5 : i - 4] = ["{\\backslash fboxsep " + 
separation]
+        if separation != defaultSep and thickness != defaultThick:
+            document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + 
thickness + "\\backslash fboxsep " + separation]
+        if shadowsize != defaultShadow and separation == defaultSep and 
thickness == defaultThick:
+            document.body[i - 5 : i - 4] = ["{\\backslash shadowsize " + 
shadowsize]
+        if shadowsize != defaultShadow and separation != defaultSep and 
thickness == defaultThick:
+            document.body[i - 5 : i - 4] = ["{\\backslash fboxsep " + 
separation + "\\backslash shadowsize " + shadowsize]
+        if shadowsize != defaultShadow and separation == defaultSep and 
thickness != defaultThick:
+            document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + 
thickness + "\\backslash shadowsize " + shadowsize]
+        if shadowsize != defaultShadow and separation != defaultSep and 
thickness != defaultThick:
+            document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + 
thickness + "\\backslash fboxsep " + separation + "\\backslash shadowsize " + 
shadowsize]
+        i = i + 11
+
+
 ##
 # Conversion hub
 #
@@ -978,10 +1037,12 @@ convert = [
            [485, []],
            [486, []],
            [487, []],
-           [488, [convert_newgloss]]
+           [488, [convert_newgloss]],
+           [489, [convert_BoxFeatures]]
           ]
 
 revert =  [
+           [488, [revert_BoxFeatures]],
            [487, [revert_newgloss, revert_glossgroup]],
            [486, [revert_forest]],
            [485, [revert_ex_itemargs]],
diff --git a/src/frontends/qt4/GuiBox.cpp b/src/frontends/qt4/GuiBox.cpp
index 86cdf8e..c5244d0 100644
--- a/src/frontends/qt4/GuiBox.cpp
+++ b/src/frontends/qt4/GuiBox.cpp
@@ -6,6 +6,7 @@
  * \author Jürgen Vigna (Minipage stuff)
  * \author Martin Vermeer
  * \author Jürgen Spitzmüller
+ * \author Uwe Stöhr
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -98,13 +99,28 @@ GuiBox::GuiBox(QWidget * parent) : InsetParamsWidget(parent)
                this, SIGNAL(changed()));
        connect(halignCO, SIGNAL(activated(int)), this, SIGNAL(changed()));
        connect(ialignCO, SIGNAL(activated(int)), this, SIGNAL(changed()));
+       connect(thicknessED, SIGNAL(textChanged(QString)), this, 
SIGNAL(changed()));
+       connect(thicknessUnitsLC, SIGNAL(selectionChanged(lyx::Length::UNIT)),
+               this, SIGNAL(changed()));
+       connect(separationED, SIGNAL(textChanged(QString)), this, 
SIGNAL(changed()));
+       connect(separationUnitsLC, SIGNAL(selectionChanged(lyx::Length::UNIT)),
+               this, SIGNAL(changed()));
+       connect(shadowsizeED, SIGNAL(textChanged(QString)), this, 
SIGNAL(changed()));
+       connect(shadowsizeUnitsLC, SIGNAL(selectionChanged(lyx::Length::UNIT)),
+               this, SIGNAL(changed()));
 
        heightED->setValidator(unsignedLengthValidator(heightED));
        widthED->setValidator(unsignedLengthValidator(widthED));
+       thicknessED->setValidator(unsignedLengthValidator(thicknessED));
+       separationED->setValidator(unsignedLengthValidator(separationED));
+       shadowsizeED->setValidator(unsignedLengthValidator(shadowsizeED));
 
        // initialize the length validator
        addCheckedWidget(widthED, widthCB);
        addCheckedWidget(heightED, heightCB);
+       addCheckedWidget(thicknessED, thicknessLA);
+       addCheckedWidget(separationED, separationLA);
+       addCheckedWidget(shadowsizeED, shadowsizeLA);
 
        initDialog();
 }
@@ -142,11 +158,10 @@ void GuiBox::on_typeCO_activated(int index)
                        heightCB->setChecked(false);
                setSpecial(ibox);
        }
-       if (type != "Boxed") {
+       if (type != "Boxed")
                if (type != "Frameless")
                        widthCB->setChecked(itype != "none");
                pagebreakCB->setChecked(false);
-       }
        changed();
 }
 
@@ -160,6 +175,15 @@ void GuiBox::initDialog()
        widthUnitsLC->setCurrentItem(Length::PCW);
        heightED->setText("1");
        heightUnitsLC->setCurrentItem("totalheight");
+       // LaTeX's default for \fboxrule is 0.4 pt
+       thicknessED->setText("0.4");
+       thicknessUnitsLC->setCurrentItem(Length::PT);
+       // LaTeX's default for \fboxsep is 3 pt
+       separationED->setText("3");
+       separationUnitsLC->setCurrentItem(Length::PT);
+       // LaTeX's default for \shadowsize is 4 pt
+       shadowsizeED->setText("4");
+       shadowsizeUnitsLC->setCurrentItem(Length::PT);
 }
 
 
@@ -226,10 +250,14 @@ void GuiBox::paramsToDialog(Inset const * inset)
        ialignCO->setEnabled(ibox);
        setSpecial(ibox);
 
-       // halign is only allowed without inner box and if a width is used and 
if
-       // pagebreak is not used
-       halignCO->setEnabled(!pagebreakCB->isChecked() && widthCB->isChecked()
-                            && ((!ibox && type == "Boxed") || 
params.use_makebox));
+       // halign is only allowed if a width is used
+       halignCO->setEnabled(widthCB->isChecked());
+       // add the entry "Stretch" if the box is \makebox or \framebox and if 
not already there
+       if ((inner_type == "makebox" || (type == "Boxed" && inner_type == 
"none"))
+               && halignCO->count() < 4)
+               halignCO->addItem(toqstr("Stretch"));
+       else if (inner_type != "makebox" && (type != "Boxed" && inner_type != 
"none"))
+               halignCO->removeItem(3); 
        // pagebreak is only allowed for Boxed without inner box
        pagebreakCB->setEnabled(!ibox && type == "Boxed");
 
@@ -271,6 +299,24 @@ void GuiBox::paramsToDialog(Inset const * inset)
                heightCB->setCheckState(Qt::Checked);
 
        heightCB->setEnabled(ibox);
+
+       // enable line thickness only for the rectangular frame types and drop 
shadow
+       thicknessED->setEnabled(type == "Boxed" || type == "Doublebox" || type 
== "Shadowbox");
+       thicknessUnitsLC->setEnabled(type == "Boxed" || type == "Doublebox" || 
type == "Shadowbox");
+       lengthToWidgets(thicknessED, thicknessUnitsLC,
+               (params.thickness).asString(), default_unit);
+       // enable line separation for the allowed frame types
+       separationED->setEnabled(type == "Boxed" || type == "ovalbox" || type 
== "Ovalbox"
+               || type == "Doublebox" || type == "Shadowbox");
+       separationUnitsLC->setEnabled(type == "Boxed" || type == "ovalbox" || 
type == "Ovalbox"
+               || type == "Doublebox" || type == "Shadowbox");
+       lengthToWidgets(separationED, separationUnitsLC,
+               (params.separation).asString(), default_unit);
+       // enable shadow size for drop shadow
+       shadowsizeED->setEnabled(type == "Shadowbox");
+       shadowsizeUnitsLC->setEnabled(type == "Shadowbox");
+       lengthToWidgets(shadowsizeED, shadowsizeUnitsLC,
+               (params.shadowsize).asString(), default_unit);
 }
 
 
@@ -338,6 +384,21 @@ docstring GuiBox::dialogToParams() const
                                Length(widgetsToLength(heightED, 
heightUnitsLC));
                }
        }
+
+       // handle the line thickness, line separation and shadow size
+       if (thicknessED->isEnabled())
+               params.thickness = Length(widgetsToLength(thicknessED, 
thicknessUnitsLC));
+       else
+               params.thickness = Length();
+       if (separationED->isEnabled())
+               params.separation = Length(widgetsToLength(separationED, 
separationUnitsLC));
+       else
+               params.separation = Length();
+       if (separationED->isEnabled())
+               params.shadowsize = Length(widgetsToLength(shadowsizeED, 
shadowsizeUnitsLC));
+       else
+               params.shadowsize = Length();
+
        return from_ascii(InsetBox::params2string(params));
 }
 
@@ -358,39 +419,79 @@ bool GuiBox::checkWidgets(bool readonly) const
                heightED->setEnabled(false);
                heightUnitsLC->setEnabled(false);
                heightCB->setEnabled(false);
+               thicknessED->setEnabled(false);
+               thicknessUnitsLC->setEnabled(false);
+               separationED->setEnabled(false);
+               separationUnitsLC->setEnabled(false);
+               shadowsizeED->setEnabled(false);
+               shadowsizeUnitsLC->setEnabled(false);
        } else {
                QString const outer =
                        typeCO->itemData(typeCO->currentIndex()).toString();
                QString const itype =
                        
innerBoxCO->itemData(innerBoxCO->currentIndex()).toString();
                bool const ibox = (itype != "none" && itype != "makebox");
-               // pagebreak is only allowed for Boxed without inner box
-               pagebreakCB->setEnabled(!ibox && outer == "Boxed");
-               innerBoxCO->setEnabled(!pagebreakCB->isChecked());
                valignCO->setEnabled(ibox);
                ialignCO->setEnabled(ibox);
-               // halign is only allowed without inner box and if a width is 
used and if
-               // pagebreak is not used
-               halignCO->setEnabled(!pagebreakCB->isChecked() && 
widthCB->isChecked()
-                                    && ((!ibox && outer == "Boxed") || itype 
== "makebox"));
+               if (heightCB->isChecked() && !ibox)
+                       heightCB->setChecked(false);
+               heightCB->setEnabled(ibox);
                // the width can only be selected for makebox or framebox
                widthCB->setEnabled(itype == "makebox"
-                                   || (outer == "Boxed"
-                                       && !ibox && !pagebreakCB->isChecked()));
-               // except for frameless and boxed, the width cannot be 
specified if
+                       || (outer == "Boxed" && itype == "none")
+                       && !pagebreakCB->isChecked());
+               // except for Frameless and Boxed, the width cannot be 
specified if
                // there is no inner box
                bool const width_enabled =
                        ibox || outer == "Frameless" || outer == "Boxed";
-               // enable if width_enabled, except if checkbox is active but 
unset
-               widthED->setEnabled(width_enabled || (widthCB->isEnabled() && 
widthCB->isChecked()));
-               widthUnitsLC->setEnabled(width_enabled || (widthCB->isEnabled() 
&& widthCB->isChecked()));
+               // enable if width_enabled
+               widthED->setEnabled(width_enabled);
+               widthUnitsLC->setEnabled(width_enabled);
                if (!widthCB->isChecked() && widthCB->isEnabled()) {
                        widthED->setEnabled(false);
                        widthUnitsLC->setEnabled(false);
                }
+               // halign is only allowed if a width is used
+               halignCO->setEnabled(widthCB->isChecked());
+               // add the entry "Stretch" if the box is \makebox or \framebox 
and if not already there
+               if ((itype == "makebox" || (outer == "Boxed" && itype == 
"none"))
+                       && halignCO->count() < 4)
+                       halignCO->addItem(toqstr("Stretch"));
+               else if (itype != "makebox" && (outer != "Boxed" && itype != 
"none"))
+                       halignCO->removeItem(3);
+               // pagebreak is only allowed for Boxed without inner box
+               pagebreakCB->setEnabled(!ibox && outer == "Boxed");
+
                heightED->setEnabled(itype != "none" && heightCB->isChecked());
                heightUnitsLC->setEnabled(itype != "none" && 
heightCB->isChecked());
                heightCB->setEnabled(ibox);
+
+               // enable line thickness for the rectangular frame types and 
drop shadow
+               thicknessED->setEnabled(outer == "Boxed" || outer == 
"Doublebox" || outer == "Shadowbox");
+               thicknessUnitsLC->setEnabled(outer == "Boxed" || outer == 
"Doublebox" || outer == "Shadowbox");
+               // set default values if empty
+               if (thicknessED->text().isEmpty() && thicknessED->isEnabled()) {
+                       thicknessED->setText("0.4");
+                       thicknessUnitsLC->setCurrentItem(Length::PT);
+               }
+               // enable line separation for the allowed frame types
+               separationED->setEnabled(outer == "Boxed" || outer == "ovalbox" 
|| outer == "Ovalbox"
+                       || outer == "Doublebox" || outer == "Shadowbox");
+               separationUnitsLC->setEnabled(outer == "Boxed" || outer == 
"ovalbox" || outer == "Ovalbox"
+                       || outer == "Doublebox" || outer == "Shadowbox");
+               // set default values if empty
+               if (separationED->text().isEmpty() && 
separationED->isEnabled()) {
+                       separationED->setText("3");
+                       separationUnitsLC->setCurrentItem(Length::PT);
+               }
+               // enable shadow size for drop shadow
+               shadowsizeED->setEnabled(outer == "Shadowbox");
+               shadowsizeUnitsLC->setEnabled(outer == "Shadowbox");
+               // set default values if empty
+               if (shadowsizeED->text().isEmpty() && 
shadowsizeED->isEnabled()) {
+                       shadowsizeED->setText("4");
+                       shadowsizeUnitsLC->setCurrentItem(Length::PT);
+               }
        }
 
        return InsetParamsWidget::checkWidgets();
diff --git a/src/frontends/qt4/ui/BoxUi.ui b/src/frontends/qt4/ui/BoxUi.ui
index 982b077..bd530c2 100644
--- a/src/frontends/qt4/ui/BoxUi.ui
+++ b/src/frontends/qt4/ui/BoxUi.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>261</width>
-    <height>245</height>
+    <width>262</width>
+    <height>411</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -16,40 +16,137 @@
   <property name="sizeGripEnabled" stdset="0">
    <bool>true</bool>
   </property>
-  <layout class="QGridLayout">
-   <property name="margin">
-    <number>9</number>
-   </property>
-   <property name="spacing">
-    <number>6</number>
-   </property>
-   <item row="4" column="0" colspan="2">
-    <widget class="QCheckBox" name="pagebreakCB">
-     <property name="toolTip">
-      <string>Check this if the box should break across pages</string>
+  <layout class="QGridLayout" name="gridLayout_4">
+   <item row="0" column="0">
+    <widget class="QGroupBox" name="TypesizeGB">
+     <property name="title">
+      <string>Type and size</string>
      </property>
-     <property name="text">
-      <string>Allow &amp;page breaks</string>
+     <property name="flat">
+      <bool>true</bool>
      </property>
+     <layout class="QGridLayout" name="gridLayout_3">
+      <item row="0" column="0">
+       <widget class="QLabel" name="innerBoxLA">
+        <property name="toolTip">
+         <string/>
+        </property>
+        <property name="text">
+         <string>Inner Bo&amp;x:</string>
+        </property>
+        <property name="buddy">
+         <cstring>innerBoxCO</cstring>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QCheckBox" name="widthCB">
+        <property name="toolTip">
+         <string/>
+        </property>
+        <property name="text">
+         <string>&amp;Width:</string>
+        </property>
+        <property name="checked">
+         <bool>false</bool>
+        </property>
+        <property name="tristate">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLineEdit" name="widthED">
+        <property name="toolTip">
+         <string>Width value</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="2">
+       <widget class="lyx::frontend::LengthCombo" name="widthUnitsLC"/>
+      </item>
+      <item row="2" column="0">
+       <widget class="QCheckBox" name="heightCB">
+        <property name="toolTip">
+         <string/>
+        </property>
+        <property name="text">
+         <string>&amp;Height:</string>
+        </property>
+        <property name="checked">
+         <bool>false</bool>
+        </property>
+        <property name="tristate">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLineEdit" name="heightED">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="toolTip">
+         <string>Height value</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="2">
+       <widget class="lyx::frontend::LengthCombo" name="heightUnitsLC">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0" colspan="2">
+       <widget class="QCheckBox" name="pagebreakCB">
+        <property name="toolTip">
+         <string>Check this if the box should break across pages</string>
+        </property>
+        <property name="text">
+         <string>Allow &amp;page breaks</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1" colspan="2">
+       <widget class="QComboBox" name="innerBoxCO">
+        <property name="toolTip">
+         <string>Inner box -- needed for fixed width &amp; line breaks</string>
+        </property>
+        <item>
+         <property name="text">
+          <string>None</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Parbox</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Minipage</string>
+         </property>
+        </item>
+       </widget>
+      </item>
+     </layout>
     </widget>
    </item>
-   <item row="5" column="0" colspan="3">
-    <widget class="QGroupBox" name="groupBox_2">
+   <item row="1" column="0">
+    <widget class="QGroupBox" name="AlignmentGB">
      <property name="title">
       <string>Alignment</string>
      </property>
      <property name="flat">
       <bool>true</bool>
      </property>
-     <layout class="QGridLayout">
-      <property name="margin">
-       <number>9</number>
-      </property>
-      <property name="spacing">
-       <number>6</number>
-      </property>
+     <layout class="QGridLayout" name="gridLayout_2">
       <item row="1" column="2">
        <widget class="QComboBox" name="halignCO">
+        <property name="enabled">
+         <bool>true</bool>
+        </property>
         <property name="sizePolicy">
          <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
           <horstretch>0</horstretch>
@@ -74,15 +171,58 @@
           <string>Right</string>
          </property>
         </item>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLabel" name="ialignLA">
+        <property name="toolTip">
+         <string>Vertical alignment of the content inside the box</string>
+        </property>
+        <property name="text">
+         <string>Vertical</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="2">
+       <widget class="QLabel" name="halignLA">
+        <property name="toolTip">
+         <string>Horizontal alignment of the content inside the box</string>
+        </property>
+        <property name="text">
+         <string>Horizontal</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QComboBox" name="valignCO">
+        <property name="enabled">
+         <bool>true</bool>
+        </property>
+        <property name="toolTip">
+         <string>Vertical alignment of the box (with regard to 
baseline)</string>
+        </property>
         <item>
          <property name="text">
-          <string>Stretch</string>
+          <string>Top</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Middle</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Bottom</string>
          </property>
         </item>
        </widget>
       </item>
       <item row="1" column="1">
        <widget class="QComboBox" name="ialignCO">
+        <property name="enabled">
+         <bool>true</bool>
+        </property>
         <property name="sizePolicy">
          <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
           <horstretch>0</horstretch>
@@ -114,26 +254,14 @@
         </item>
        </widget>
       </item>
-      <item row="2" column="1">
-       <widget class="QComboBox" name="valignCO">
-        <property name="toolTip">
-         <string>Vertical alignment of the box (with regard to 
baseline)</string>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string>Co&amp;ntent:</string>
+        </property>
+        <property name="buddy">
+         <cstring>ialignCO</cstring>
         </property>
-        <item>
-         <property name="text">
-          <string>Top</string>
-         </property>
-        </item>
-        <item>
-         <property name="text">
-          <string>Middle</string>
-         </property>
-        </item>
-        <item>
-         <property name="text">
-          <string>Bottom</string>
-         </property>
-        </item>
        </widget>
       </item>
       <item row="2" column="0">
@@ -149,153 +277,113 @@
         </property>
        </widget>
       </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="label">
+     </layout>
+    </widget>
+   </item>
+   <item row="2" column="0">
+    <widget class="QGroupBox" name="DecorationGB">
+     <property name="title">
+      <string>Decoration</string>
+     </property>
+     <property name="flat">
+      <bool>true</bool>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <widget class="QLabel" name="typeLA">
+        <property name="toolTip">
+         <string/>
+        </property>
         <property name="text">
-         <string>Co&amp;ntent:</string>
+         <string>&amp;Decoration:</string>
         </property>
         <property name="buddy">
-         <cstring>ialignCO</cstring>
+         <cstring>typeCO</cstring>
         </property>
        </widget>
       </item>
-      <item row="0" column="1">
-       <widget class="QLabel" name="ialignLA">
+      <item row="0" column="1" colspan="2">
+       <widget class="QComboBox" name="typeCO">
         <property name="toolTip">
-         <string>Vertical alignment of the content inside the box</string>
+         <string>Supported box types</string>
         </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="thicknessLA">
         <property name="text">
-         <string>Vertical</string>
+         <string>Line thickness:</string>
         </property>
        </widget>
       </item>
-      <item row="0" column="2">
-       <widget class="QLabel" name="halignLA">
+      <item row="1" column="1">
+       <widget class="QLineEdit" name="thicknessED">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
         <property name="toolTip">
-         <string>Horizontal alignment of the content inside the box</string>
+         <string>Width value</string>
         </property>
+       </widget>
+      </item>
+      <item row="1" column="2">
+       <widget class="lyx::frontend::LengthCombo" name="thicknessUnitsLC">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="separationLA">
         <property name="text">
-         <string>Horizontal</string>
+         <string>Box separation:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLineEdit" name="separationED">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="toolTip">
+         <string>Width value</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="2">
+       <widget class="lyx::frontend::LengthCombo" name="separationUnitsLC">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QLabel" name="shadowsizeLA">
+        <property name="text">
+         <string>Shadow size:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1">
+       <widget class="QLineEdit" name="shadowsizeED">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="toolTip">
+         <string>Width value</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="2">
+       <widget class="lyx::frontend::LengthCombo" name="shadowsizeUnitsLC">
+        <property name="enabled">
+         <bool>false</bool>
         </property>
        </widget>
       </item>
      </layout>
     </widget>
    </item>
-   <item row="3" column="2">
-    <widget class="lyx::frontend::LengthCombo" name="heightUnitsLC">
-     <property name="enabled">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0">
-    <widget class="QCheckBox" name="heightCB">
-     <property name="toolTip">
-      <string/>
-     </property>
-     <property name="text">
-      <string>&amp;Height:</string>
-     </property>
-     <property name="checked">
-      <bool>false</bool>
-     </property>
-     <property name="tristate">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0">
-    <widget class="QLabel" name="innerBoxLA">
-     <property name="toolTip">
-      <string/>
-     </property>
-     <property name="text">
-      <string>Inner Bo&amp;x:</string>
-     </property>
-     <property name="buddy">
-      <cstring>innerBoxCO</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="2">
-    <widget class="lyx::frontend::LengthCombo" name="widthUnitsLC"/>
-   </item>
-   <item row="0" column="0">
-    <widget class="QLabel" name="typeLA">
-     <property name="toolTip">
-      <string/>
-     </property>
-     <property name="text">
-      <string>&amp;Decoration:</string>
-     </property>
-     <property name="buddy">
-      <cstring>typeCO</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0">
-    <widget class="QCheckBox" name="widthCB">
-     <property name="toolTip">
-      <string/>
-     </property>
-     <property name="text">
-      <string>&amp;Width:</string>
-     </property>
-     <property name="checked">
-      <bool>false</bool>
-     </property>
-     <property name="tristate">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="1">
-    <widget class="QLineEdit" name="heightED">
-     <property name="enabled">
-      <bool>false</bool>
-     </property>
-     <property name="toolTip">
-      <string>Height value</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <widget class="QLineEdit" name="widthED">
-     <property name="toolTip">
-      <string>Width value</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1" colspan="2">
-    <widget class="QComboBox" name="innerBoxCO">
-     <property name="toolTip">
-      <string>Inner box -- needed for fixed width &amp; line breaks</string>
-     </property>
-     <item>
-      <property name="text">
-       <string>None</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Parbox</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Minipage</string>
-      </property>
-     </item>
-    </widget>
-   </item>
-   <item row="0" column="1" colspan="2">
-    <widget class="QComboBox" name="typeCO">
-     <property name="toolTip">
-      <string>Supported box types</string>
-     </property>
-    </widget>
-   </item>
   </layout>
  </widget>
  <customwidgets>
@@ -308,11 +396,7 @@
  <tabstops>
   <tabstop>typeCO</tabstop>
   <tabstop>innerBoxCO</tabstop>
-  <tabstop>widthED</tabstop>
-  <tabstop>widthUnitsLC</tabstop>
   <tabstop>heightCB</tabstop>
-  <tabstop>heightED</tabstop>
-  <tabstop>heightUnitsLC</tabstop>
   <tabstop>ialignCO</tabstop>
   <tabstop>halignCO</tabstop>
   <tabstop>valignCO</tabstop>
diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp
index ddb1dce..011df87 100644
--- a/src/insets/InsetBox.cpp
+++ b/src/insets/InsetBox.cpp
@@ -6,6 +6,7 @@
  * \author Angus Leeming
  * \author Martin Vermeer
  * \author Jürgen Spitzmüller
+ * \author Uwe Stöhr
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -272,20 +273,36 @@ void InsetBox::latex(otexstream & os, OutputParams const 
& runparams) const
        BoxType btype = boxtranslator().find(params_.type);
 
        string width_string = params_.width.asLatexString();
+       string thickness_string = params_.thickness.asLatexString();
+       string defaultThick = "0.4pt";
+       string separation_string = params_.separation.asLatexString();
+       string defaultSep = "3pt";
+       string shadowsize_string = params_.shadowsize.asLatexString();
+       string defaultShadow = "4pt";
        bool stdwidth = false;
-       // FIXME: do not test explicitely values of width_string
-       if (params_.inner_box &&
-                       (width_string.find("1.0\\columnwidth") != string::npos
-                       || width_string.find("1.0\\textwidth") != 
string::npos)) {
+       // in general the overall width of some decorated boxes is wider thean 
the inner box
+       // we could therefore calculate the real width for all sizes so that if 
the user wants
+       // e.g. 0.1\columnwidth or 2cm he gets exactly this size
+       // however this makes problems when importing TeX code
+       // therefore only recalculate for the most common case that the box 
should not protrude
+       // the page margins
+       if (params_.inner_box
+               && ((width_string.find("1\\columnwidth") != string::npos
+                       || width_string.find("1\\textwidth") != string::npos)
+                       || width_string.find("1\\paperwidth") != string::npos
+                       || width_string.find("1\\linewidth") != string::npos)) {
                stdwidth = true;
                switch (btype) {
                case Frameless:
+                       break;
                case Framed:
+                       width_string += " - 2\\FrameSep - 2\\FrameRule";
                        break;
                case Boxed:
-               case Shaded:
                        width_string += " - 2\\fboxsep - 2\\fboxrule";
                        break;
+               case Shaded:
+                       break;
                case ovalbox:
                        width_string += " - 2\\fboxsep - 0.8pt";
                        break;
@@ -293,8 +310,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & 
runparams) const
                        width_string += " - 2\\fboxsep - 1.6pt";
                        break;
                case Shadowbox:
-                       // Shadow falls outside right margin... opinions?
-                       width_string += " - 2\\fboxsep - 2\\fboxrule"/* 
"-\\shadowsize"*/;
+                       width_string += " - 2\\fboxsep - 2\\fboxrule - 
\\shadowsize";
                        break;
                case Doublebox:
                        width_string += " - 2\\fboxsep - 7.5\\fboxrule - 1pt";
@@ -306,17 +322,34 @@ void InsetBox::latex(otexstream & os, OutputParams const 
& runparams) const
        if (runparams.lastid != -1)
                os.texrow().start(runparams.lastid, runparams.lastpos);
 
-       // Adapt to column/text width correctly also if paragraphs indented:
-       if (stdwidth)
+       // adapt column/text width correctly also if paragraphs indented
+       if (stdwidth && !(buffer().params().paragraph_separation))
                os << "\\noindent";
 
        switch (btype) {
        case Frameless:
                break;
        case Framed:
+               if (!(thickness_string.find(defaultThick) != string::npos)) {
+                       os << "{\\FrameRule " << from_ascii(thickness_string);
+                       if (!(separation_string.find(defaultSep) != 
string::npos))
+                               os << "\\FrameSep " << 
from_ascii(separation_string);
+               }
+               if (!(separation_string.find(defaultSep) != string::npos)
+                       && (thickness_string.find(defaultThick) != 
string::npos))
+                       os << "{\\FrameSep " << from_ascii(separation_string);
+
                os << "\\begin{framed}%\n";
                break;
        case Boxed:
+               if (!(thickness_string.find(defaultThick) != string::npos)) {
+                       os << "{\\fboxrule " << from_ascii(thickness_string);
+                       if (!(separation_string.find(defaultSep) != 
string::npos))
+                               os << "\\fboxsep " << 
from_ascii(separation_string);
+               }
+               if (!(separation_string.find(defaultSep) != string::npos)
+                       && (thickness_string.find(defaultThick) != 
string::npos))
+                       os << "{\\fboxsep " << from_ascii(separation_string);
                if (!width_string.empty()) {
                        if (!params_.inner_box) {
                                os << "\\framebox";
@@ -338,12 +371,37 @@ void InsetBox::latex(otexstream & os, OutputParams const 
& runparams) const
                os << "{";
                break;
        case ovalbox:
+               if (!separation_string.empty() && 
separation_string.find(defaultSep) == string::npos)
+                       os << "{\\fboxsep " << from_ascii(separation_string);
                os << "\\ovalbox{";
                break;
        case Ovalbox:
+               if (!separation_string.empty() && 
separation_string.find(defaultSep) == string::npos)
+                       os << "{\\fboxsep " << from_ascii(separation_string);
                os << "\\Ovalbox{";
                break;
        case Shadowbox:
+               if (!(thickness_string.find(defaultThick) != string::npos)) {
+                       os << "{\\fboxrule " << from_ascii(thickness_string);
+                       if (!(separation_string.find(defaultSep) != 
string::npos)) {
+                               os << "\\fboxsep " << 
from_ascii(separation_string);
+                               if (!(shadowsize_string.find(defaultShadow) != 
string::npos))
+                                       os << "\\shadowsize " << 
from_ascii(shadowsize_string);
+                       }
+                       if (!(shadowsize_string.find(defaultShadow) != 
string::npos)
+                               && (separation_string.find(defaultSep) != 
string::npos))
+                               os << "\\shadowsize " << 
from_ascii(shadowsize_string);
+               }
+               if (!(separation_string.find(defaultSep) != string::npos)
+                       && (thickness_string.find(defaultThick) != 
string::npos)) {
+                               os << "{\\fboxsep " << 
from_ascii(separation_string);
+                               if (!(shadowsize_string.find(defaultShadow) != 
string::npos))
+                                       os << "\\shadowsize " << 
from_ascii(shadowsize_string);
+               }
+               if (!(shadowsize_string.find(defaultShadow) != string::npos)
+                               && (separation_string.find(defaultSep) != 
string::npos)
+                               && (thickness_string.find(defaultThick) != 
string::npos))
+                               os << "{\\shadowsize " << 
from_ascii(shadowsize_string);
                os << "\\shadowbox{";
                break;
        case Shaded:
@@ -351,6 +409,14 @@ void InsetBox::latex(otexstream & os, OutputParams const & 
runparams) const
                // it is inside a minipage or parbox
                break;
        case Doublebox:
+               if (!(thickness_string.find(defaultThick) != string::npos)) {
+                       os << "{\\fboxrule " << from_ascii(thickness_string);
+                       if (!(separation_string.find(defaultSep) != 
string::npos))
+                               os << "\\fboxsep " << 
from_ascii(separation_string);
+               }
+               if (!(separation_string.find(defaultSep) != string::npos)
+                       && (thickness_string.find(defaultThick) != 
string::npos))
+                       os << "{\\fboxsep " << from_ascii(separation_string);
                os << "\\doublebox{";
                break;
        }
@@ -414,6 +480,23 @@ void InsetBox::latex(otexstream & os, OutputParams const & 
runparams) const
                os << "\\begin{shaded}%\n";
        }
 
+       // \framebox and \makebox handle hor_pos their own way
+       // hor_pos is senseless for \mbox and \fbox
+       if (!(params_.use_makebox)
+               && !(btype == Boxed && !params_.inner_box)) {
+                       switch (params_.hor_pos) {
+                       case 'l':
+                               // do nothing because this is LaTeX's default
+                               break;
+                       case 'c':
+                               os << "\\centering ";
+                               break;
+                       case 'r':
+                               os << "\\raggedleft ";
+                               break;
+                       }
+       }
+
        InsetText::latex(os, runparams);
 
        if (btype == Shaded)
@@ -431,15 +514,38 @@ void InsetBox::latex(otexstream & os, OutputParams const 
& runparams) const
                break;
        case Framed:
                os << "\\end{framed}";
+               if (!(separation_string.find(defaultSep) != string::npos)
+                       || !(thickness_string.find(defaultThick) != 
string::npos))
+                       os << "}";
                break;
        case Boxed:
                os << "}";
+               if (!(separation_string.find(defaultSep) != string::npos)
+                       || !(thickness_string.find(defaultThick) != 
string::npos))
+                       os << "}";
                break;
        case ovalbox:
+               os << "}";
+               if (!(separation_string.find(defaultSep) != string::npos))
+                       os << "}";
+               break;
        case Ovalbox:
+               os << "}";
+               if (!(separation_string.find(defaultSep) != string::npos))
+                       os << "}";
+               break;
        case Doublebox:
+               os << "}";
+               if (!(separation_string.find(defaultSep) != string::npos)
+                       || !(thickness_string.find(defaultThick) != 
string::npos))
+                       os << "}";
+               break;
        case Shadowbox:
                os << "}";
+               if (!(separation_string.find(defaultSep) != string::npos)
+                       || !(thickness_string.find(defaultThick) != 
string::npos)
+                       || !(shadowsize_string.find(defaultShadow) != 
string::npos))
+                       os << "}";
                break;
        case Shaded:
                // already done
@@ -548,6 +654,7 @@ void InsetBox::validate(LaTeXFeatures & features) const
        case Frameless:
                break;
        case Framed:
+               features.require("calc");
                features.require("framed");
                break;
        case Boxed:
@@ -632,7 +739,10 @@ InsetBoxParams::InsetBoxParams(string const & label)
          hor_pos('c'),
          inner_pos('t'),
          height(Length("1in")),
-         height_special("totalheight") // default is 1\\totalheight
+         height_special("totalheight"), // default is 1\\totalheight
+         thickness(Length("0.4pt")),
+         separation(Length("3pt")),
+         shadowsize(Length("4pt"))
 {}
 
 
@@ -649,6 +759,9 @@ void InsetBoxParams::write(ostream & os) const
        os << "special \"" << special << "\"\n";
        os << "height \"" << height.asString() << "\"\n";
        os << "height_special \"" << height_special << "\"\n";
+       os << "thickness \"" << thickness.asString() << "\"\n";
+       os << "separation \"" << separation.asString() << "\"\n";
+       os << "shadowsize \"" << shadowsize.asString() << "\"\n";
 }
 
 
@@ -668,6 +781,9 @@ void InsetBoxParams::read(Lexer & lex)
        lex >> "special" >> special;
        lex >> "height" >> height;
        lex >> "height_special" >> height_special;
+       lex >> "thickness" >> thickness;
+       lex >> "separation" >> separation;
+       lex >> "shadowsize" >> shadowsize;
 }
 
 
diff --git a/src/insets/InsetBox.h b/src/insets/InsetBox.h
index 76b11f6..e8ea613 100644
--- a/src/insets/InsetBox.h
+++ b/src/insets/InsetBox.h
@@ -6,6 +6,7 @@
  *
  * \author Angus Leeming
  * \author Martin Vermeer
+ * \author Uwe Stöhr
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -52,6 +53,12 @@ public:
        Length height;
        ///
        std::string height_special;
+       ///
+       Length thickness;
+       ///
+       Length separation;
+       ///
+       Length shadowsize;
 };
 
 
diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp
index 33c389b..88ec91d 100644
--- a/src/tex2lyx/text.cpp
+++ b/src/tex2lyx/text.cpp
@@ -847,6 +847,9 @@ void parse_box(Parser & p, ostream & os, unsigned 
outer_flags,
        string width_unit;
        string latex_width;
        string width_special = "none";
+       string thickness = "0.4pt";
+       string separation = "3pt";
+       string shadowsize = "4pt";
        if (!inner_type.empty() && p.hasOpt()) {
                if (inner_type != "makebox")
                        position = p.getArg('[', ']');
@@ -1071,6 +1074,9 @@ void parse_box(Parser & p, ostream & os, unsigned 
outer_flags,
                os << "special \"" << width_special << "\"\n";
                os << "height \"" << height_value << height_unit << "\"\n";
                os << "height_special \"" << height_special << "\"\n";
+               os << "thickness \"" << thickness << "\"\n";
+               os << "separation \"" << separation << "\"\n";
+               os << "shadowsize \"" << shadowsize << "\"\n";
                os << "status open\n\n";
 
                // Unfortunately we can't use parse_text_in_inset:
diff --git a/src/version.h b/src/version.h
index e52d96b..8407528 100644
--- a/src/version.h
+++ b/src/version.h
@@ -32,8 +32,8 @@ extern char const * const lyx_version_info;
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-#define LYX_FORMAT_LYX 488 // spitz: rework the Glosse insets
-#define LYX_FORMAT_TEX2LYX 488
+#define LYX_FORMAT_LYX 489 // uwestoehr: new box features
+#define LYX_FORMAT_TEX2LYX 489
 
 #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
 #ifndef _MSC_VER

Reply via email to