commit aa9543fa2bcb1bda0435cee5c1a24a2c3d5008b7
Author: Juergen Spitzmueller <[email protected]>
Date:   Thu May 10 20:15:11 2018 +0200

    Add support for global float alignment
    
    It is now possible in the float settings (doc dialog) to specify a global
    (inner) alignment for floats, and in the float settings, this can be
    overridden (just as with float placement)
    
    Fixes: #8665
    
    File format change.
---
 development/FORMAT                       |    8 +
 lib/lyx2lyx/lyx_2_4.py                   |   74 +++++++-
 src/Buffer.cpp                           |    1 +
 src/BufferParams.cpp                     |    7 +-
 src/BufferParams.h                       |    2 +
 src/frontends/qt4/FloatPlacement.cpp     |  106 ++++++++---
 src/frontends/qt4/FloatPlacement.h       |   14 +-
 src/frontends/qt4/GuiDocument.cpp        |   10 +-
 src/frontends/qt4/ui/FloatPlacementUi.ui |  303 +++++++++++++++++++++---------
 src/insets/InsetFloat.cpp                |   35 +++-
 src/insets/InsetFloat.h                  |    5 +-
 src/version.h                            |    4 +-
 12 files changed, 430 insertions(+), 139 deletions(-)

diff --git a/development/FORMAT b/development/FORMAT
index 8338ee1..d443601 100644
--- a/development/FORMAT
+++ b/development/FORMAT
@@ -7,6 +7,14 @@ changes happened in particular if possible. A good example 
would be
 
 -----------------------
 
+2018-05-10  Jürgen Spitzmüller <[email protected]>
+       * format incremented to 552: support for float alignment
+         - add buffer param \float_alignment [class|left|center|right]
+         - add buffer param \float_placement class
+         - add float param alignment [class|document|left|center|right]
+         - add float param placement class (=> new param)
+         - add float param placement document(=> like formerly empty param)
+
 2018-05-06  Jürgen Spitzmüller <[email protected]>
        * format incremented to 551: add font info param \nospellcheck that 
prevents
           text from being spellchecked.
diff --git a/lib/lyx2lyx/lyx_2_4.py b/lib/lyx2lyx/lyx_2_4.py
index 941703a..fae273d 100644
--- a/lib/lyx2lyx/lyx_2_4.py
+++ b/lib/lyx2lyx/lyx_2_4.py
@@ -213,6 +213,74 @@ def revert_nospellcheck(document):
         del document.body[i]
 
 
+def revert_floatpclass(document):
+    " Remove float placement params 'document' and 'class' "
+
+    i = 0
+    i = find_token(document.header, "\\float_placement class", 0)
+    if i != -1:
+        del document.header[i]
+
+    i = 0
+    while True:
+        i = find_token(document.body, '\\begin_inset Float', i)
+        if i == -1:
+            break
+        j = find_end_of_inset(document.body, i)
+        k = find_token(document.body, 'placement class', i, i + 2)
+        if k == -1:
+            k = find_token(document.body, 'placement document', i, i + 2)
+            if k != -1:
+                del document.body[k]
+            i = j
+            continue
+        del document.body[k]
+
+
+def revert_floatalignment(document):
+    " Remove float alignment params "
+
+    i = 0
+    i = find_token(document.header, "\\float_alignment", 0)
+    galignment = ""
+    if i != -1:
+        galignment = get_value(document.header, "\\float_alignment", i)
+        del document.header[i]
+
+    i = 0
+    while True:
+        i = find_token(document.body, '\\begin_inset Float', i)
+        if i == -1:
+            break
+        j = find_end_of_inset(document.body, i)
+        if j == -1:
+            document.warning("Malformed LyX document: Can't find end of inset 
at line " + str(i))
+            i += 1
+        k = find_token(document.body, 'alignment', i, i + 4)
+        if k == -1:
+            i = j
+            continue
+        alignment = get_value(document.body, "alignment", k)
+        if alignment == "document":
+            alignment = galignment
+        del document.body[k]
+        l = find_token(document.body, "\\begin_layout Plain Layout", i, j)
+        if l == -1:
+            document.warning("Can't find float layout!")
+            i = j
+            continue
+        alcmd = []
+        if alignment == "left":
+            alcmd = put_cmd_in_ert("\\raggedright{}")
+        elif alignment == "center":
+            alcmd = put_cmd_in_ert("\\centering{}")
+        elif alignment == "right":
+            alcmd = put_cmd_in_ert("\\raggedleft{}")
+        if len(alcmd) > 0:
+            document.body[l+1:l+1] = alcmd
+        i = j 
+
+
 ##
 # Conversion hub
 #
@@ -225,11 +293,13 @@ convert = [
            [548, []],
            [549, []],
            [550, [convert_fontenc]],
-           [551, []]
+           [551, []],
+           [552, []]
           ]
 
 revert =  [
-           [549, [revert_nospellcheck]],
+           [551, [revert_floatpclass, revert_floatalignment]],
+           [550, [revert_nospellcheck]],
            [549, [revert_fontenc]],
            [548, []],# dummy format change
            [547, [revert_lscape]],
diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index 83a82f8..47db5f0 100644
--- a/src/Buffer.cpp
+++ b/src/Buffer.cpp
@@ -888,6 +888,7 @@ int Buffer::readHeader(Lexer & lex)
        params().options.erase();
        params().master.erase();
        params().float_placement.erase();
+       params().float_alignment.erase();
        params().paperwidth.erase();
        params().paperheight.erase();
        params().leftmargin.erase();
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index 7211f12..6d52731 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -1071,6 +1071,8 @@ string BufferParams::readToken(Lexer & lex, string const 
& token,
                spacing().set(spacetranslator().find(nspacing), tmp_val);
        } else if (token == "\\float_placement") {
                lex >> float_placement;
+       } else if (token == "\\float_alignment") {
+               lex >> float_alignment;
 
        } else if (prefixIs(token, "\\pdf_") || token == "\\use_hyperref") {
                string toktmp = pdfoptions().readToken(lex, token);
@@ -1261,9 +1263,10 @@ void BufferParams::writeFile(ostream & os, Buffer const 
* buf) const
        os << "\\bibtex_command " << bibtex_command << '\n';
        os << "\\index_command " << index_command << '\n';
 
-       if (!float_placement.empty()) {
+       if (!float_placement.empty())
                os << "\\float_placement " << float_placement << '\n';
-       }
+       if (!float_alignment.empty())
+               os << "\\float_alignment " << float_alignment << '\n';
        os << "\\paperfontsize " << fontsize << '\n';
 
        spacing().writeFile(os);
diff --git a/src/BufferParams.h b/src/BufferParams.h
index bc5c10d..21c6cff 100644
--- a/src/BufferParams.h
+++ b/src/BufferParams.h
@@ -352,6 +352,8 @@ public:
        ///
        std::string float_placement;
        ///
+       std::string float_alignment;
+       ///
        unsigned int columns;
        ///
        bool justification;
diff --git a/src/frontends/qt4/FloatPlacement.cpp 
b/src/frontends/qt4/FloatPlacement.cpp
index 59bdf62..810644a 100644
--- a/src/frontends/qt4/FloatPlacement.cpp
+++ b/src/frontends/qt4/FloatPlacement.cpp
@@ -5,6 +5,7 @@
  *
  * \author Edwin Leuven
  * \author John Levon
+ * \author Jürgen Spitzmüller
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -33,12 +34,13 @@ namespace lyx {
 namespace frontend {
 
 FloatPlacement::FloatPlacement(bool show_options, QWidget * parent)
-       : InsetParamsWidget(parent), standardfloat_ (true),
+       : InsetParamsWidget(parent), standardfloat_(true),
          allows_wide_(true), allows_sideways_(true), float_list_(0)
 {
        setupUi(this);
 
        connect(floatTypeCO, SIGNAL(activated(int)), this, SLOT(changedSlot()));
+       connect(placementCO, SIGNAL(activated(int)), this, SLOT(changedSlot()));
        connect(topCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
        connect(bottomCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
        connect(pageCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
@@ -47,11 +49,19 @@ FloatPlacement::FloatPlacement(bool show_options, QWidget * 
parent)
        connect(ignoreCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
        connect(spanCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
        connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
+       connect(alignClassDefaultRB, SIGNAL(clicked()), this, 
SLOT(changedSlot()));
+       connect(alignDocDefaultRB, SIGNAL(clicked()), this, 
SLOT(changedSlot()));
+       connect(alignLeftRB, SIGNAL(clicked()), this, SLOT(changedSlot()));
+       connect(alignCenterRB, SIGNAL(clicked()), this, SLOT(changedSlot()));
+       connect(alignRightRB, SIGNAL(clicked()), this, SLOT(changedSlot()));
 
        floatTypeTitle->setVisible(show_options);
        floatTypeCO->setVisible(show_options);
+       alignDocDefaultRB->setVisible(show_options);
        spanCB->setVisible(show_options);
        sidewaysCB->setVisible(show_options);
+       optionsGB->setVisible(show_options);
+       initFloatPlacementCO(show_options);
 }
 
 
@@ -59,7 +69,10 @@ docstring FloatPlacement::dialogToParams() const
 {
        InsetFloatParams params;
        params.type = 
fromqstr(floatTypeCO->itemData(floatTypeCO->currentIndex()).toString());
-       params.placement = get(params.wide, params.sideways);
+       params.wide = spanCB->isChecked();
+       params.sideways = sidewaysCB->isChecked();
+       params.alignment = getAlignment();
+       params.placement = getPlacement();
        return from_ascii(InsetFloat::params2string(params));
 }
 
@@ -82,9 +95,10 @@ bool FloatPlacement::possiblePlacement(char const & p) const
 }
 
 
-void FloatPlacement::set(string const & placement)
+void FloatPlacement::setPlacement(string const & placement)
 {
        bool def_placement = false;
+       bool doc_placement = false;
        bool top = false;
        bool bottom = false;
        bool page = false;
@@ -92,9 +106,11 @@ void FloatPlacement::set(string const & placement)
        bool force = false;
        bool here_definitely = false;
 
-       if (placement.empty()) {
+       if (placement.empty() || placement == "class")
                def_placement = true;
-       } else if (contains(placement, 'H') && possiblePlacement('H')) {
+       else if (placement == "document")
+               doc_placement = true;
+       else if (contains(placement, 'H') && possiblePlacement('H')) {
                here_definitely = true;
        } else {
                if (contains(placement, '!') && possiblePlacement('!')) {
@@ -114,7 +130,12 @@ void FloatPlacement::set(string const & placement)
                }
        }
 
-       defaultsCB->setChecked(def_placement);
+       if (def_placement)
+               
placementCO->setCurrentIndex(placementCO->findData(toqstr("class")));
+       else if (doc_placement)
+               
placementCO->setCurrentIndex(placementCO->findData(toqstr("document")));
+       else
+               
placementCO->setCurrentIndex(placementCO->findData(toqstr("custom")));
        topCB->setChecked(top);
        bottomCB->setChecked(bottom);
        pageCB->setChecked(page);
@@ -125,6 +146,21 @@ void FloatPlacement::set(string const & placement)
 }
 
 
+void FloatPlacement::setAlignment(string const & alignment)
+{
+       if (alignment == "document")
+               alignDocDefaultRB->setChecked(true);
+       else if (alignment == "left")
+               alignLeftRB->setChecked(true);
+       else if (alignment == "center")
+               alignCenterRB->setChecked(true);
+       else if (alignment == "right")
+               alignRightRB->setChecked(true);
+       else
+               alignClassDefaultRB->setChecked(true);
+}
+
+
 void FloatPlacement::initFloatTypeCO(FloatList const & floats)
 {
        if (float_list_ == &floats)
@@ -141,6 +177,15 @@ void FloatPlacement::initFloatTypeCO(FloatList const & 
floats)
 }
 
 
+void FloatPlacement::initFloatPlacementCO(bool const local)
+{
+       placementCO->addItem(qt_("Class Defaults"), "class");
+       if (local)
+               placementCO->addItem(qt_("Document Defaults"), "document");
+       placementCO->addItem(qt_("Custom"), "custom");
+}
+
+
 void FloatPlacement::paramsToDialog(Inset const * inset)
 {
        InsetFloat const * fl = static_cast<InsetFloat const *>(inset);
@@ -157,7 +202,8 @@ void FloatPlacement::paramsToDialog(Inset const * inset)
        allows_sideways_ = floats.allowsSideways(params.type);
        allows_wide_ = floats.allowsWide(params.type);
 
-       set(params.placement);
+       setPlacement(params.placement);
+       setAlignment(params.alignment);
 
        standardfloat_ = (params.type == "figure"
                || params.type == "table");
@@ -175,21 +221,16 @@ void FloatPlacement::paramsToDialog(Inset const * inset)
 }
 
 
-string const FloatPlacement::get(bool & wide, bool & sideways) const
-{
-       wide = spanCB->isChecked();
-       sideways = sidewaysCB->isChecked();
-
-       return get();
-}
-
-
-string const FloatPlacement::get() const
+string const FloatPlacement::getPlacement() const
 {
        string placement;
 
-       if (defaultsCB->isChecked())
-               return placement;
+       QString const data =
+               placementCO->itemData(placementCO->currentIndex()).toString();
+       if (data == "class")
+               return "class";
+       if (data == "document")
+               return "document";
 
        if (heredefinitelyCB->isChecked()) {
                placement += 'H';
@@ -214,10 +255,24 @@ string const FloatPlacement::get() const
 }
 
 
-void FloatPlacement::on_defaultsCB_stateChanged(int state)
+string const FloatPlacement::getAlignment() const
+{
+       if (alignDocDefaultRB->isChecked())
+               return "document";
+       if (alignLeftRB->isChecked())
+               return "left";
+       if (alignCenterRB->isChecked())
+               return "center";
+       if (alignRightRB->isChecked())
+               return "right";
+       return "class";
+}
+
+
+void FloatPlacement::on_placementCO_currentIndexChanged(QString const & text)
 {
        checkAllowed();
-       if (state == Qt::Checked)
+       if (text != "custom")
                return;
        if (topCB->isChecked() || bottomCB->isChecked()
           || pageCB->isChecked() || herepossiblyCB->isChecked()
@@ -235,7 +290,8 @@ void FloatPlacement::changedSlot()
 
 void FloatPlacement::checkAllowed() const
 {
-       bool const defaults = defaultsCB->isChecked();
+       bool const defaults =
+               placementCO->itemData(placementCO->currentIndex()).toString() 
!= "custom";
        bool const ignore = topCB->isChecked() || bottomCB->isChecked()
                      || pageCB->isChecked() || herepossiblyCB->isChecked();
        bool const heredefinitely = heredefinitelyCB->isChecked();
@@ -273,7 +329,7 @@ void FloatPlacement::checkAllowed() const
                        bottomCB->setChecked(false);
                spanCB->setEnabled(allows_wide_ && (!sideways || 
standardfloat_));
                sidewaysCB->setEnabled(allows_sideways_);
-               defaultsCB->setEnabled(!(sideways && span));
+               placementCO->setEnabled(!(sideways && span));
        } else {
                topCB->setEnabled(!defaults && !heredefinitely);
                bottomCB->setEnabled(!defaults && !heredefinitely);
@@ -289,8 +345,8 @@ bool FloatPlacement::checkWidgets(bool readonly) const
 {
        if (readonly) {
                floatTypeCO->setEnabled(false);
-               defaultsCB->setEnabled(false);
-               options->setEnabled(false);
+               placementCO->setEnabled(false);
+               aligmentGB->setEnabled(false);
                spanCB->setEnabled(false);
                sidewaysCB->setEnabled(false);
        } else
diff --git a/src/frontends/qt4/FloatPlacement.h 
b/src/frontends/qt4/FloatPlacement.h
index c5f8dd7..d5d9449 100644
--- a/src/frontends/qt4/FloatPlacement.h
+++ b/src/frontends/qt4/FloatPlacement.h
@@ -45,22 +45,26 @@ public:
        ///
        void useSideways();
        ///
-       void set(std::string const & placement);
+       void setPlacement(std::string const & placement);
        ///
-       std::string const get() const;
+       void setAlignment(std::string const & placement);
+       ///
+       std::string const getPlacement() const;
+       ///
+       std::string const getAlignment() const;
 
 private Q_SLOTS:
-       void on_defaultsCB_stateChanged(int state);
+       void on_placementCO_currentIndexChanged(QString const &);
        void changedSlot();
 
 private:
        ///
        void checkAllowed() const;
        ///
-       std::string const get(bool & wide, bool & sideways) const;
-       ///
        void initFloatTypeCO(FloatList const & floats);
        ///
+       void initFloatPlacementCO(bool const);
+       ///
        bool possiblePlacement(char const & p) const;
 
        /// one of figure or table?
diff --git a/src/frontends/qt4/GuiDocument.cpp 
b/src/frontends/qt4/GuiDocument.cpp
index 5fc1e06..b519677 100644
--- a/src/frontends/qt4/GuiDocument.cpp
+++ b/src/frontends/qt4/GuiDocument.cpp
@@ -1556,7 +1556,7 @@ GuiDocument::GuiDocument(GuiView & lv)
        docPS->addPanel(indicesModule, N_("Indexes"));
        docPS->addPanel(pdfSupportModule, N_("PDF Properties"));
        docPS->addPanel(mathsModule, N_("Math Options"));
-       docPS->addPanel(floatModule, N_("Float Placement"));
+       docPS->addPanel(floatModule, N_("Float Settings"));
        docPS->addPanel(listingsModule, N_("Listings[[inset]]"));
        docPS->addPanel(bulletsModule, N_("Bullets"));
        docPS->addPanel(branchesModule, N_("Branches"));
@@ -3216,8 +3216,9 @@ void GuiDocument::applyView()
        bp_.maintain_unincluded_children =
                masterChildModule->maintainAuxCB->isChecked();
 
-       // Float Placement
-       bp_.float_placement = floatModule->get();
+       // Float Settings
+       bp_.float_placement = floatModule->getPlacement();
+       bp_.float_alignment = floatModule->getAlignment();
 
        // Listings
        // text should have passed validation
@@ -3747,7 +3748,8 @@ void GuiDocument::paramsToDialog()
                bp_.maintain_unincluded_children);
 
        // Float Settings
-       floatModule->set(bp_.float_placement);
+       floatModule->setPlacement(bp_.float_placement);
+       floatModule->setAlignment(bp_.float_alignment);
 
        // ListingsSettings
        // break listings_params to multiple lines
diff --git a/src/frontends/qt4/ui/FloatPlacementUi.ui 
b/src/frontends/qt4/ui/FloatPlacementUi.ui
index f6e02ae..3e44707 100644
--- a/src/frontends/qt4/ui/FloatPlacementUi.ui
+++ b/src/frontends/qt4/ui/FloatPlacementUi.ui
@@ -1,121 +1,258 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
  <class>FloatPlacementUi</class>
- <widget class="QWidget" name="FloatPlacementUi" >
-  <property name="geometry" >
+ <widget class="QWidget" name="FloatPlacementUi">
+  <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>207</width>
-    <height>382</height>
+    <width>530</width>
+    <height>413</height>
    </rect>
   </property>
-  <property name="windowTitle" >
+  <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout" >
-   <item row="0" column="0" >
-    <widget class="QLabel" name="floatTypeTitle" >
-     <property name="text" >
-      <string>Float Type:</string>
-     </property>
-    </widget>
+  <layout class="QGridLayout" name="gridLayout_3">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <widget class="QLabel" name="floatTypeTitle">
+       <property name="text">
+        <string>Float T&amp;ype:</string>
+       </property>
+       <property name="buddy">
+        <cstring>floatTypeCO</cstring>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QComboBox" name="floatTypeCO">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>1</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+      </widget>
+     </item>
+    </layout>
    </item>
-   <item row="0" column="1" colspan="2" >
-    <widget class="QComboBox" name="floatTypeCO" >
-     <property name="sizePolicy" >
-      <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
-       <horstretch>1</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
+   <item row="2" column="3" rowspan="3">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
      </property>
-    </widget>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>154</height>
+      </size>
+     </property>
+    </spacer>
    </item>
-   <item row="1" column="0" colspan="4" >
-    <widget class="QCheckBox" name="defaultsCB" >
-     <property name="text" >
-      <string>Use &amp;default placement</string>
+   <item row="4" column="0">
+    <spacer>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
      </property>
-    </widget>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
    </item>
-   <item row="2" column="0" colspan="4" >
-    <widget class="QGroupBox" name="options" >
-     <property name="title" >
-      <string>Advanced Placement Options</string>
+   <item row="1" column="3">
+    <widget class="QGroupBox" name="aligmentGB">
+     <property name="title">
+      <string>Alignment of Contents</string>
      </property>
-     <layout class="QGridLayout" >
-      <property name="margin" >
+     <property name="flat">
+      <bool>true</bool>
+     </property>
+     <layout class="QGridLayout" name="_2">
+      <property name="leftMargin">
        <number>9</number>
       </property>
-      <property name="spacing" >
+      <property name="topMargin">
+       <number>9</number>
+      </property>
+      <property name="rightMargin">
+       <number>9</number>
+      </property>
+      <property name="bottomMargin">
+       <number>9</number>
+      </property>
+      <property name="spacing">
        <number>6</number>
       </property>
-      <item row="0" column="0" >
-       <widget class="QCheckBox" name="topCB" >
-        <property name="text" >
-         <string>&amp;Top of page</string>
+      <item row="1" column="0">
+       <widget class="QRadioButton" name="alignDocDefaultRB">
+        <property name="toolTip">
+         <string>Use the document's default alignment for floats, as specified 
in Document Settings.</string>
+        </property>
+        <property name="text">
+         <string>D&amp;ocument Defaults</string>
         </property>
        </widget>
       </item>
-      <item row="5" column="0" >
-       <widget class="QCheckBox" name="ignoreCB" >
-        <property name="text" >
-         <string>&amp;Ignore LaTeX rules</string>
+      <item row="2" column="0">
+       <widget class="QRadioButton" name="alignLeftRB">
+        <property name="toolTip">
+         <string>Left-align float contents</string>
+        </property>
+        <property name="text">
+         <string>&amp;Left</string>
         </property>
        </widget>
       </item>
-      <item row="4" column="0" >
-       <widget class="QCheckBox" name="heredefinitelyCB" >
-        <property name="text" >
-         <string>Here de&amp;finitely</string>
+      <item row="3" column="0">
+       <widget class="QRadioButton" name="alignCenterRB">
+        <property name="toolTip">
+         <string>Center float contents</string>
+        </property>
+        <property name="text">
+         <string>&amp;Center</string>
         </property>
        </widget>
       </item>
-      <item row="3" column="0" >
-       <widget class="QCheckBox" name="herepossiblyCB" >
-        <property name="text" >
-         <string>&amp;Here if possible</string>
+      <item row="4" column="0">
+       <widget class="QRadioButton" name="alignRightRB">
+        <property name="toolTip">
+         <string>Right-align float contents</string>
+        </property>
+        <property name="text">
+         <string>&amp;Right</string>
         </property>
        </widget>
       </item>
-      <item row="2" column="0" >
-       <widget class="QCheckBox" name="pageCB" >
-        <property name="text" >
-         <string>&amp;Page of floats</string>
+      <item row="0" column="0">
+       <widget class="QRadioButton" name="alignClassDefaultRB">
+        <property name="toolTip">
+         <string>Use the class' default alignment for floats, whatever it 
is.</string>
+        </property>
+        <property name="text">
+         <string>Class &amp;Defaults</string>
         </property>
        </widget>
       </item>
-      <item row="1" column="0" >
-       <widget class="QCheckBox" name="bottomCB" >
-        <property name="text" >
-         <string>&amp;Bottom of page</string>
+     </layout>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="2">
+    <widget class="QGroupBox" name="optionsGB">
+     <property name="title">
+      <string>Further Options</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <widget class="QCheckBox" name="spanCB">
+        <property name="text">
+         <string>&amp;Span columns</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QCheckBox" name="sidewaysCB">
+        <property name="text">
+         <string>Rotate side&amp;ways</string>
         </property>
        </widget>
       </item>
      </layout>
     </widget>
    </item>
-   <item row="3" column="0" colspan="2" >
-    <widget class="QCheckBox" name="spanCB" >
-     <property name="text" >
-      <string>&amp;Span columns</string>
+   <item row="1" column="0" rowspan="2" colspan="2">
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Position on Page</string>
      </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <item>
+         <widget class="QLabel" name="placementLA">
+          <property name="text">
+           <string>Place&amp;ment Settings:</string>
+          </property>
+          <property name="buddy">
+           <cstring>placementCO</cstring>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QComboBox" name="placementCO"/>
+        </item>
+       </layout>
+      </item>
+      <item row="1" column="0">
+       <widget class="QCheckBox" name="topCB">
+        <property name="text">
+         <string>&amp;Top of page</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QCheckBox" name="bottomCB">
+        <property name="text">
+         <string>&amp;Bottom of page</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QCheckBox" name="pageCB">
+        <property name="text">
+         <string>&amp;Page of floats</string>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="0">
+       <widget class="QCheckBox" name="herepossiblyCB">
+        <property name="text">
+         <string>&amp;Here if possible</string>
+        </property>
+       </widget>
+      </item>
+      <item row="5" column="0">
+       <widget class="QCheckBox" name="heredefinitelyCB">
+        <property name="text">
+         <string>Here de&amp;finitely</string>
+        </property>
+       </widget>
+      </item>
+      <item row="6" column="0">
+       <widget class="QCheckBox" name="ignoreCB">
+        <property name="text">
+         <string>&amp;Ignore LaTeX rules</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
     </widget>
    </item>
-   <item row="4" column="0" colspan="2" >
-    <widget class="QCheckBox" name="sidewaysCB" >
-     <property name="text" >
-      <string>&amp;Rotate sideways</string>
+   <item row="0" column="1" colspan="3">
+    <spacer name="horizontalSpacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
      </property>
-    </widget>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>303</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
    </item>
-   <item row="5" column="2" colspan="2" >
-    <spacer>
-     <property name="orientation" >
-      <enum>Qt::Vertical</enum>
+   <item row="1" column="4">
+    <spacer name="horizontalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
      </property>
-     <property name="sizeHint" stdset="0" >
+     <property name="sizeHint" stdset="0">
       <size>
-       <width>20</width>
+       <width>40</width>
        <height>20</height>
       </size>
      </property>
@@ -124,7 +261,6 @@
   </layout>
  </widget>
  <tabstops>
-  <tabstop>defaultsCB</tabstop>
   <tabstop>topCB</tabstop>
   <tabstop>bottomCB</tabstop>
   <tabstop>pageCB</tabstop>
@@ -133,25 +269,8 @@
   <tabstop>ignoreCB</tabstop>
  </tabstops>
  <includes>
-  <include location="local" >qt_i18n.h</include>
+  <include location="local">qt_i18n.h</include>
  </includes>
  <resources/>
- <connections>
-  <connection>
-   <sender>defaultsCB</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>options</receiver>
-   <slot>setDisabled(bool)</slot>
-   <hints>
-    <hint type="sourcelabel" >
-     <x>51</x>
-     <y>20</y>
-    </hint>
-    <hint type="destinationlabel" >
-     <x>201</x>
-     <y>47</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
+ <connections/>
 </ui>
diff --git a/src/insets/InsetFloat.cpp b/src/insets/InsetFloat.cpp
index 021b7f3..c3600a1 100644
--- a/src/insets/InsetFloat.cpp
+++ b/src/insets/InsetFloat.cpp
@@ -166,6 +166,7 @@ void InsetFloat::doDispatch(Cursor & cur, FuncRequest & cmd)
                        params_.wide      = params.wide;
                        params_.sideways  = params.sideways;
                }
+               params_.alignment  = params.alignment;
                setNewLabel();
                if (params_.type != params.type)
                        setCaptionType(params.type);
@@ -235,6 +236,8 @@ void InsetFloatParams::write(ostream & os) const
 
        if (!placement.empty())
                os << "placement " << placement << "\n";
+       if (!alignment.empty())
+               os << "alignment " << alignment << "\n";
 
        if (wide)
                os << "wide true\n";
@@ -254,6 +257,8 @@ void InsetFloatParams::read(Lexer & lex)
        lex >> type;
        if (lex.checkFor("placement"))
                lex >> placement;
+       if (lex.checkFor("alignment"))
+               lex >> alignment;
        lex >> "wide" >> wide;
        lex >> "sideways" >> sideways;
 }
@@ -366,13 +371,14 @@ void InsetFloat::latex(otexstream & os, OutputParams 
const & runparams_in) const
        string tmpplacement;
        string const buf_placement = buffer().params().float_placement;
        string const def_placement = floats.defaultPlacement(params_.type);
-       if (!params_.placement.empty()
-           && params_.placement != def_placement) {
-               tmpplacement = params_.placement;
-       } else if (params_.placement.empty()
-                  && !buf_placement.empty()
-                  && buf_placement != def_placement) {
+       if (params_.placement == "document"
+           && !buf_placement.empty()
+           && buf_placement != def_placement) {
                tmpplacement = buf_placement;
+       } else if (!params_.placement.empty()
+                  && params_.placement != "document"
+                  && params_.placement != def_placement) {
+               tmpplacement = params_.placement;
        }
 
        // Check if placement is allowed by this float
@@ -386,6 +392,17 @@ void InsetFloat::latex(otexstream & os, OutputParams const 
& runparams_in) const
                        placement += *lit;
        }
 
+       string alignment;
+       string const buf_alignment = buffer().params().float_alignment;
+       if (params_.alignment == "document"
+           && !buf_alignment.empty()) {
+               alignment = buf_alignment;
+       } else if (!params_.alignment.empty()
+                  && params_.alignment != "class"
+                  && params_.alignment != "document") {
+               alignment = params_.alignment;
+       }
+
        // Force \begin{<floatname>} to appear in a new line.
        os << breakln << "\\begin{" << from_ascii(tmptype) << '}';
        if (runparams.lastid != -1)
@@ -397,6 +414,12 @@ void InsetFloat::latex(otexstream & os, OutputParams const 
& runparams_in) const
            && (!params_.sideways || (params_.sideways && from_ascii(placement) 
!= "p")))
                os << '[' << from_ascii(placement) << ']';
        os << '\n';
+       if (alignment == "left")
+               os << "\\raggedright" << breakln;
+       else if (alignment == "center")
+               os << "\\centering" << breakln;
+       else if (alignment == "right")
+               os << "\\raggedleft" << breakln;
 
        InsetText::latex(os, runparams);
 
diff --git a/src/insets/InsetFloat.h b/src/insets/InsetFloat.h
index e05f567..0c56d9e 100644
--- a/src/insets/InsetFloat.h
+++ b/src/insets/InsetFloat.h
@@ -25,7 +25,8 @@ class InsetFloatParams
 {
 public:
        ///
-       InsetFloatParams() : type("senseless"), wide(false), sideways(false), 
subfloat(false) {}
+       InsetFloatParams() : type("senseless"), placement("document"), 
alignment("document"),
+               wide(false), sideways(false), subfloat(false) {}
        ///
        void write(std::ostream & os) const;
        ///
@@ -34,6 +35,8 @@ public:
        std::string type;
        ///
        std::string placement;
+       ///
+       std::string alignment;
        /// span columns
        bool wide;
        ///
diff --git a/src/version.h b/src/version.h
index ede6c33..c2dd25a 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 551 // spitz: \nospellcheck font param
-#define LYX_FORMAT_TEX2LYX 551
+#define LYX_FORMAT_LYX 552 // spitz: float alignment
+#define LYX_FORMAT_TEX2LYX 552
 
 #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
 #ifndef _MSC_VER

Reply via email to