]> git.lyx.org Git - features.git/commitdiff
add ability to change box line thickness and separation
authorUwe Stöhr <uwestoehr@lyx.org>
Mon, 11 May 2015 19:30:32 +0000 (21:30 +0200)
committerUwe Stöhr <uwestoehr@lyx.org>
Mon, 11 May 2015 19:30:32 +0000 (21:30 +0200)
fileformat change

development/FORMAT
lib/lyx2lyx/LyX.py
lib/lyx2lyx/lyx_2_2.py
src/frontends/qt4/GuiBox.cpp
src/frontends/qt4/ui/BoxUi.ui
src/insets/InsetBox.cpp
src/insets/InsetBox.h
src/tex2lyx/text.cpp
src/version.h

index a0bf4fa3159b27cdff244d56b8b4b9d8a26c7767..058e382b5339bf57b453dfd66aef7818cd7321a8 100644 (file)
@@ -11,6 +11,14 @@ adjustments are made to tex2lyx and bugs are fixed in lyx2lyx.
 
 -----------------------
 
+2015-05-xx Uwe Stöhr <uwestoehr@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 <spitz@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
index f5e6e4079b9270e4acccf22669d862496a3cac46..934f995efa3e0e0e74b6e595943bee79370fa0e5 100644 (file)
@@ -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))
                   ]
 
 ####################################################################
index 68545dd63ba5132beccfda5c78e85116ef019623..57324ace595a0e6b97cace3e47e72478979f574e 100644 (file)
@@ -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]],
index 86cdf8ee71e434bc45b980e9ee121df4f0458ceb..c5244d0116af8ca94b1eb24c645dce87d11868ed 100644 (file)
@@ -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();
index 982b0776e9afa91babcf220da8903380bf07d503..bd530c23e3475c6b24843ce2224513df4e4e7216 100644 (file)
@@ -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">
   <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>
           <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>
         </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">
         </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>
  <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>
index ddb1dce1ddad66612d33b0ea51aa686b3f9bfd18..011df87327faaf70ed56d3a24e773641161f1095 100644 (file)
@@ -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;
 }
 
 
index 76b11f63df11bb7df879a5b099020a161a9f12ed..e8ea613efd06e505ed75e1a85c0f48141577c2c1 100644 (file)
@@ -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;
 };
 
 
index 33c389ba5f4bdb3115cf3eda260bae44fd99e40c..88ec91db8b63aec5b1677919b2c0ba534b806dd8 100644 (file)
@@ -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:
index e52d96babe2bbf5e693c5b4257d1e346f14eb752..8407528cc9816d58abc989a501a4f3f227ee7b3b 100644 (file)
@@ -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