[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [calligra] /: read & write <style:column> (also use for rendering/layouting) and <style:column-gap>
From:       Friedrich W. H. Kossebau <kossebau () kde ! org>
Date:       2012-07-29 7:49:17
Message-ID: 20120729074917.CCEC1A6094 () git ! kde ! org
[Download RAW message or body]

Git commit 5458f54e209c4912107110b542d4d05ee94eaff0 by Friedrich W. H. Kossebau.
Committed on 29/07/2012 at 09:47.
Pushed by kossebau into branch 'master'.

read & write <style:column> (also use for rendering/layouting) and <style:column-gap>

also tune KoColumns API a little

REVIEW: 105736

thanks boemann for review

M  +215  -5    libs/kotext/styles/KoSectionStyle.cpp
M  +33   -9    libs/kotext/styles/KoSectionStyle.h
M  +1    -0    libs/odf/CMakeLists.txt
A  +281  -0    libs/odf/KoColumns.cpp     [License: LGPL (v2+)]
M  +102  -9    libs/odf/KoColumns.h
M  +25   -7    libs/widgets/KoPagePreviewWidget.cpp
M  +1    -2    words/part/KWDocument.cpp
M  +4    -25   words/part/KWPageStyle.cpp
M  +1    -1    words/part/KWRootAreaProvider.cpp
M  +10   -5    words/part/dialogs/KWDocumentColumns.cpp
M  +56   -25   words/part/frames/KWFrameLayout.cpp
M  +3    -3    words/part/tests/TestFrameLayout.cpp
M  +8    -7    words/part/tests/TestPageCommands.cpp

http://commits.kde.org/calligra/5458f54e209c4912107110b542d4d05ee94eaff0

diff --git a/libs/kotext/styles/KoSectionStyle.cpp \
b/libs/kotext/styles/KoSectionStyle.cpp index 294a85a..d59b931 100644
--- a/libs/kotext/styles/KoSectionStyle.cpp
+++ b/libs/kotext/styles/KoSectionStyle.cpp
@@ -4,6 +4,7 @@
  * Copyright (C) 2008 Roopesh Chander <roop@forwardbias.in>
  * Copyright (C) 2008 Girish Ramakrishnan <girish@forwardbias.in>
  * Copyright (C) 2009 KO GmbH <cbo@kogmbh.com>
+ * Copyright 2012 Friedrich W. H. Kossebau <kossebau@kde.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -34,6 +35,7 @@
 #include <QTextCursor>
 #include <QBuffer>
 
+#include <KoColumns.h>
 #include <KoUnit.h>
 #include <KoStyleStack.h>
 #include <KoOdfLoadingContext.h>
@@ -41,6 +43,8 @@
 #include <KoXmlWriter.h>
 #include <KoBorder.h>
 
+Q_DECLARE_METATYPE(QList<KoColumns::ColumnDatum>)
+
 class KoSectionStyle::Private
 {
 public:
@@ -76,6 +80,12 @@ public:
             return QColor();
         return variant.value<QColor>();
     }
+    QList<KoColumns::ColumnDatum> propertyColumnData() const{
+        QVariant variant = stylesPrivate.value(ColumnData);
+        if (variant.isNull())
+            return QList<KoColumns::ColumnDatum>();
+        return variant.value<QList<KoColumns::ColumnDatum> >();
+    }
 
     QString name;
     KoSectionStyle *parentStyle;
@@ -189,6 +199,87 @@ qreal KoSectionStyle::rightMargin() const
     return d->propertyDouble(QTextFormat::BlockRightMargin);
 }
 
+void KoSectionStyle::setColumnCount(int columnCount)
+{
+    setProperty(ColumnCount, columnCount);
+}
+
+int KoSectionStyle::columnCount() const
+{
+    return d->propertyInt(ColumnCount);
+}
+
+void KoSectionStyle::setColumnGapWidth(qreal columnGapWidth)
+{
+    setProperty(ColumnGapWidth, columnGapWidth);
+}
+
+qreal KoSectionStyle::columnGapWidth() const
+{
+    return d->propertyDouble(ColumnGapWidth);
+}
+
+void KoSectionStyle::setColumnData(const QList<KoColumns::ColumnDatum> &columnData)
+{
+    setProperty(ColumnData, QVariant::fromValue<QList<KoColumns::ColumnDatum> \
>(columnData)); +}
+
+QList<KoColumns::ColumnDatum> KoSectionStyle::columnData() const
+{
+    return d->propertyColumnData();
+}
+
+void KoSectionStyle::setSeparatorStyle(KoColumns::SeparatorStyle separatorStyle)
+{
+    setProperty(SeparatorStyle, separatorStyle);
+}
+
+KoColumns::SeparatorStyle KoSectionStyle::separatorStyle() const
+{
+    return static_cast<KoColumns::SeparatorStyle>(d->propertyInt(SeparatorStyle));
+}
+
+void KoSectionStyle::setSeparatorColor(const QColor &separatorColor)
+{
+    setProperty(SeparatorColor, separatorColor);
+}
+
+QColor KoSectionStyle::separatorColor() const
+{
+    return d->propertyColor(SeparatorColor);
+}
+
+void KoSectionStyle::setSeparatorWidth(qreal separatorWidth)
+{
+    setProperty(SeparatorWidth, separatorWidth);
+}
+
+qreal KoSectionStyle::separatorWidth() const
+{
+    return d->propertyDouble(SeparatorWidth);
+}
+
+void KoSectionStyle::setSeparatorHeight( int separatorHeight)
+{
+    setProperty(SeparatorHeight, separatorHeight);
+}
+
+int KoSectionStyle::separatorHeight() const
+{
+    return d->propertyInt(SeparatorHeight);
+}
+
+void KoSectionStyle::setSeparatorVerticalAlignment(KoColumns::SeparatorVerticalAlignment \
separatorVerticalAlignment) +{
+    setProperty(SeparatorVerticalAlignment, separatorVerticalAlignment);
+}
+
+KoColumns::SeparatorVerticalAlignment KoSectionStyle::separatorVerticalAlignment() \
const +{
+    return static_cast<KoColumns::SeparatorVerticalAlignment>(d->propertyInt(SeparatorVerticalAlignment));
 +}
+
+
 KoSectionStyle *KoSectionStyle::parentStyle() const
 {
     return d->parentStyle;
@@ -296,6 +387,60 @@ void KoSectionStyle::loadOdf(const KoXmlElement *element, \
KoOdfLoadingContext &c  setBackground(brush);
     }
 
+    if (styleStack.hasChildNode(KoXmlNS::style, "columns")) {
+        KoXmlElement columns = styleStack.childNode(KoXmlNS::style, "columns");
+        int columnCount = columns.attributeNS(KoXmlNS::fo, "column-count").toInt();
+        if (columnCount < 1)
+            columnCount = 1;
+        setColumnCount(columnCount);
+
+        if (styleStack.hasProperty(KoXmlNS::fo, "column-gap")) {
+            setColumnGapWidth(KoUnit::parseValue(columns.attributeNS(KoXmlNS::fo, \
"column-gap"))); +        } else {
+            QList <KoColumns::ColumnDatum> columnData;
+
+            KoXmlElement columnElement;
+            forEachElement(columnElement, columns) {
+                if(columnElement.localName() != QLatin1String("column") ||
+                columnElement.namespaceURI() != KoXmlNS::style)
+                    continue;
+
+                KoColumns::ColumnDatum datum;
+                datum.leftMargin = \
KoUnit::parseValue(columnElement.attributeNS(KoXmlNS::fo, "start-indent"), 0.0); +    \
datum.rightMargin = KoUnit::parseValue(columnElement.attributeNS(KoXmlNS::fo, \
"end-indent"), 0.0); +                datum.topMargin = \
KoUnit::parseValue(columnElement.attributeNS(KoXmlNS::fo, "space-before"), 0.0); +    \
datum.bottomMargin = KoUnit::parseValue(columnElement.attributeNS(KoXmlNS::fo, \
"space-after"), 0.0); +                datum.relativeWidth = \
KoColumns::parseRelativeWidth(columnElement.attributeNS(KoXmlNS::style, \
"rel-width")); +                // on a bad relativeWidth just drop all data
+                if (datum.relativeWidth <= 0) {
+                    columnData.clear();
+                    break;
+                }
+
+                columnData.append(datum);
+            }
+
+            if (! columnData.isEmpty()) {
+                setColumnData(columnData);
+            }
+        }
+
+        KoXmlElement columnSep = KoXml::namedItemNS(columns, KoXmlNS::style, \
"column-sep"); +        if (! columnSep.isNull()) {
+            if (columnSep.hasAttributeNS(KoXmlNS::style, "style"))
+                setSeparatorStyle(KoColumns::parseSeparatorStyle(columnSep.attributeNS(KoXmlNS::style, \
"style"))); +            if (columnSep.hasAttributeNS(KoXmlNS::style, "width"))
+                setSeparatorWidth(KoUnit::parseValue(columnSep.attributeNS(KoXmlNS::style, \
"width"))); +            if (columnSep.hasAttributeNS(KoXmlNS::style, "height"))
+                setSeparatorHeight(KoColumns::parseSeparatorHeight(columnSep.attributeNS(KoXmlNS::style, \
"height"))); +            if (columnSep.hasAttributeNS(KoXmlNS::style, "color"))
+                setSeparatorColor(KoColumns::parseSeparatorColor(columnSep.attributeNS(KoXmlNS::style, \
"color"))); +            if (columnSep.hasAttributeNS(KoXmlNS::style, \
"vertical-align")) +                setSeparatorVerticalAlignment(
+                    \
KoColumns::parseSeparatorVerticalAlignment(columnSep.attributeNS(KoXmlNS::style, \
"vertical-align"))); +        }
+    }
+
     styleStack.restore();
 }
 
@@ -324,6 +469,7 @@ void KoSectionStyle::removeDuplicates(const KoSectionStyle \
&other)  d->stylesPrivate.removeDuplicates(other.d->stylesPrivate);
 }
 
+
 void KoSectionStyle::saveOdf(KoGenStyle &style)
 {
     // only custom style have a displayname. automatic styles don't have a name set.
@@ -331,9 +477,12 @@ void KoSectionStyle::saveOdf(KoGenStyle &style)
         style.addAttribute("style:display-name", d->name);
     }
 
+    QList<int> columnsKeys;
+
     QList<int> keys = d->stylesPrivate.keys();
     foreach(int key, keys) {
-        if (key == KoSectionStyle::TextProgressionDirection) {
+        switch (key) {
+        case KoSectionStyle::TextProgressionDirection: {
             int directionValue = 0;
             bool ok = false;
             directionValue = d->stylesPrivate.value(key).toInt(&ok);
@@ -350,17 +499,78 @@ void KoSectionStyle::saveOdf(KoGenStyle &style)
                 if (!direction.isEmpty())
                     style.addProperty("style:writing-mode", direction, \
KoGenStyle::DefaultType);  }
-        } else if (key == QTextFormat::BackgroundBrush) {
+            break;
+        }
+        case QTextFormat::BackgroundBrush: {
             QBrush backBrush = background();
             if (backBrush.style() != Qt::NoBrush)
                 style.addProperty("fo:background-color", backBrush.color().name(), \
KoGenStyle::ParagraphType);  else
                 style.addProperty("fo:background-color", "transparent", \
                KoGenStyle::DefaultType);
-        } else if (key == QTextFormat::BlockLeftMargin) {
+            break;
+        }
+        case QTextFormat::BlockLeftMargin:
             style.addPropertyPt("fo:margin-left", leftMargin(), \
                KoGenStyle::DefaultType);
-        } else if (key == QTextFormat::BlockRightMargin) {
+            break;
+        case QTextFormat::BlockRightMargin:
             style.addPropertyPt("fo:margin-right", rightMargin(), \
                KoGenStyle::DefaultType);
-      }
+            break;
+        case ColumnCount:
+        case ColumnGapWidth:
+        case SeparatorStyle:
+        case SeparatorColor:
+        case SeparatorVerticalAlignment:
+        case SeparatorWidth:
+        case SeparatorHeight:
+            columnsKeys.append(key);
+            break;
+        }
+    }
+
+    if (!columnsKeys.isEmpty()) {
+        QBuffer buffer;
+        buffer.open(QIODevice::WriteOnly);
+        KoXmlWriter elementWriter(&buffer);    // TODO pass indentation level
+
+        elementWriter.startElement("style:columns");
+        // seems these two are mandatory
+        elementWriter.addAttribute("fo:column-count", columnCount());
+        elementWriter.addAttributePt("fo:column-gap", columnGapWidth());
+        columnsKeys.removeOne(ColumnCount);
+        columnsKeys.removeOne(ColumnGapWidth);
+
+        if (!columnsKeys.isEmpty()) {
+            elementWriter.startElement("style:column-sep");
+            foreach(int key, columnsKeys) {
+                switch (key) {
+                case SeparatorStyle:
+                    elementWriter.addAttribute("style:style",
+                                               \
KoColumns::separatorStyleString(separatorStyle())); +                    break;
+                case SeparatorColor:
+                    elementWriter.addAttribute("style:color",
+                                               separatorColor().name());
+                    break;
+                case SeparatorVerticalAlignment:
+                    elementWriter.addAttribute("style:vertical-align",
+                                               \
KoColumns::separatorVerticalAlignmentString(separatorVerticalAlignment())); +         \
break; +                case SeparatorWidth:
+                    elementWriter.addAttributePt("style:width",
+                                                 separatorWidth());
+                    break;
+                case SeparatorHeight:
+                    elementWriter.addAttribute("style:height",
+                                               \
QString::fromLatin1("%1%").arg(separatorHeight())); +                    break;
+                }
+            }
+            elementWriter.endElement(); // style:column-sep
+        }
+
+        elementWriter.endElement(); // style:columns
+        const QString elementContents = QString::fromUtf8(buffer.buffer(), \
buffer.buffer().size()); +        style.addChildElement("style:columns", \
elementContents);  }
 }
 
diff --git a/libs/kotext/styles/KoSectionStyle.h \
b/libs/kotext/styles/KoSectionStyle.h index 7d06a9e..455499a 100644
--- a/libs/kotext/styles/KoSectionStyle.h
+++ b/libs/kotext/styles/KoSectionStyle.h
@@ -54,7 +54,15 @@ class KOTEXT_EXPORT KoSectionStyle : public QObject
 public:
     enum Property {
         StyleId = QTextFormat::UserProperty + 1,
-        TextProgressionDirection
+        TextProgressionDirection,
+        ColumnCount,
+        ColumnData,
+        ColumnGapWidth,
+        SeparatorStyle,
+        SeparatorColor,
+        SeparatorVerticalAlignment,
+        SeparatorWidth,
+        SeparatorHeight
     };
 
     /// Constructor
@@ -67,14 +75,6 @@ public:
     /// creates a clone of this style with the specified parent
     KoSectionStyle *clone(QObject *parent = 0) const;
 
-    /**
-     * Return the current columns settings.
-     */
-    KoColumns columns() const;
-    /**
-     * Set the new columns settings
-     */
-    void setColumns(const KoColumns &columns);
 
     /// duplicated property from QTextBlockFormat
     void setLeftMargin(qreal margin);
@@ -104,6 +104,30 @@ public:
     int indent() const;
 #endif
 
+    void setColumnCount(int columnCount);
+    int columnCount() const;
+
+    void setColumnGapWidth(qreal columnGapWidth);
+    qreal columnGapWidth() const;
+
+    void setColumnData(const QList<KoColumns::ColumnDatum> &columnData);
+    QList<KoColumns::ColumnDatum> columnData() const;
+
+    void setSeparatorStyle(KoColumns::SeparatorStyle separatorStyle);
+    KoColumns::SeparatorStyle separatorStyle() const;
+
+    void setSeparatorColor(const QColor &separatorColor);
+    QColor separatorColor() const;
+
+    void setSeparatorVerticalAlignment(KoColumns::SeparatorVerticalAlignment \
separatorVerticalAlignment); +    KoColumns::SeparatorVerticalAlignment \
separatorVerticalAlignment() const; +
+    void setSeparatorWidth(qreal separatorWidth);
+    qreal separatorWidth() const;
+
+    void setSeparatorHeight(int separatorHeight);
+    int separatorHeight() const;
+
     /// set the parent style this one inherits its unset properties from.
     void setParentStyle(KoSectionStyle *parent);
 
diff --git a/libs/odf/CMakeLists.txt b/libs/odf/CMakeLists.txt
index ce45ade..b47441f 100644
--- a/libs/odf/CMakeLists.txt
+++ b/libs/odf/CMakeLists.txt
@@ -35,6 +35,7 @@ set(koodf_LIB_SRCS
     KoShadowStyle.cpp
     KoPageLayout.cpp
     KoPageFormat.cpp
+    KoColumns.cpp
     KoStore.cpp
     KoTarStore.cpp
     KoDirectoryStore.cpp
diff --git a/libs/odf/KoColumns.cpp b/libs/odf/KoColumns.cpp
new file mode 100644
index 0000000..ae66ec6
--- /dev/null
+++ b/libs/odf/KoColumns.cpp
@@ -0,0 +1,281 @@
+/* This file is part of the KDE project
+   Copyright 2012 Friedrich W. H. Kossebau <kossebau@kde.org>
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public License
+   along with this library; see the file COPYING.LIB.  If not, write to
+   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.
+*/
+
+#include "KoColumns.h"
+
+#include "KoXmlWriter.h"
+#include "KoGenStyle.h"
+#include "KoXmlReader.h"
+#include "KoXmlNS.h"
+#include "KoUnit.h"
+// KDE
+#include <KDebug>
+
+static const int defaultColumnCount = 1;
+static const KoColumns::SeparatorStyle defaultSeparatorStyle = KoColumns::None;
+static const int defaultSeparatorHeight = 100;
+static const  Qt::GlobalColor defaultSeparatorColor = Qt::black;
+static const KoColumns::SeparatorVerticalAlignment defaultSeparatorVerticalAlignment \
= KoColumns::AlignTop; +static const int defaultColumnGapWidth = 17; // in pt, ~ 6mm
+
+
+
+const char * KoColumns::separatorStyleString(KoColumns::SeparatorStyle \
separatorStyle) +{
+    const char * result;
+
+    //  skip KoColumns::None, is default
+    if (separatorStyle == Solid) {
+        result = "solid";
+    } else if (separatorStyle == Dotted) {
+        result = "dotted";
+    } else if (separatorStyle == Dashed) {
+        result = "dashed";
+    } else if (separatorStyle == DotDashed) {
+        result = "dot-dashed";
+    } else {
+        result = "none";
+    }
+
+    return result;
+}
+
+const char * KoColumns::separatorVerticalAlignmentString(KoColumns::SeparatorVerticalAlignment \
separatorVerticalAlignment) +{
+    const char * result;
+
+    //  skip KoColumns::AlignTop, is default
+    if (separatorVerticalAlignment == AlignVCenter) {
+        result = "middle";
+    } else if (separatorVerticalAlignment == AlignBottom) {
+        result = "bottom";
+    } else {
+        result = "top";
+    }
+
+    return result;
+}
+
+KoColumns::SeparatorVerticalAlignment \
KoColumns::parseSeparatorVerticalAlignment(const QString &value) +{
+    // default to AlignTop
+    SeparatorVerticalAlignment result = defaultSeparatorVerticalAlignment;
+
+    if (! value.isEmpty()) {
+        // skip "top", is default
+        if (value == QLatin1String("middle")) {
+            result = AlignVCenter;
+        } else if (value == QLatin1String("bottom")) {
+            result = AlignBottom;
+        }
+    }
+
+    return result;
+}
+
+QColor KoColumns::parseSeparatorColor(const QString &value)
+{
+    QColor result(value);
+
+    if (! result.isValid())
+        // default is black, cmp. ODF 1.2  §19.467
+        result = QColor(defaultSeparatorColor);
+
+    return result;
+}
+
+// TODO: see if there is another parse method somewhere which can be used here
+int KoColumns::parseSeparatorHeight(const QString &value)
+{
+    int result = defaultSeparatorHeight;
+
+    // only try to convert if it ends with a %, so is also not empty
+    if (value.endsWith(QLatin1Char('%'))) {
+        bool ok = false;
+        // try to convert
+        result = value.left(value.length()-1).toInt(&ok);
+        // reset to 100% if conversion failed (which sets result to 0)
+        if (! ok) {
+            result = defaultSeparatorHeight;
+        }
+    }
+
+    return result;
+}
+
+KoColumns::SeparatorStyle KoColumns::parseSeparatorStyle(const QString &value)
+{
+    SeparatorStyle result = None;
+    if (! value.isEmpty()) {
+        //  skip "none", is default
+        if (value == QLatin1String("solid")) {
+            result = Solid;
+        } else if (value == QLatin1String("dotted")) {
+            result = Dotted;
+        } else if (value == QLatin1String("dashed")) {
+            result = Dashed;
+        } else if (value == QLatin1String("dot-dashed")) {
+            result = DotDashed;
+        }
+    }
+
+    return result;
+}
+
+int KoColumns::parseRelativeWidth(const QString &value)
+{
+    int result = 0;
+
+    // only try to convert if it ends with a *, so is also not empty
+    if (value.endsWith(QLatin1Char('*'))) {
+        bool ok = false;
+        // try to convert
+        result = value.left(value.length()-1).toInt(&ok);
+        if (! ok) {
+            result = 0;
+        }
+    }
+
+    return result;
+}
+
+KoColumns::KoColumns()
+  : count(defaultColumnCount)
+  , gapWidth(defaultColumnGapWidth)
+  , separatorStyle(defaultSeparatorStyle)
+  , separatorColor(defaultSeparatorColor)
+  , separatorVerticalAlignment(defaultSeparatorVerticalAlignment)
+  , separatorHeight(defaultSeparatorHeight)
+{
+}
+
+void KoColumns::reset()
+{
+    count = defaultColumnCount;
+    gapWidth = defaultColumnGapWidth;
+    separatorStyle = defaultSeparatorStyle;
+    separatorColor = QColor(defaultSeparatorColor);
+    separatorVerticalAlignment = defaultSeparatorVerticalAlignment;
+    separatorHeight = defaultSeparatorHeight;
+}
+
+bool KoColumns::operator==(const KoColumns& rhs) const {
+    return
+        count == rhs.count &&
+        (columnData.isEmpty() && rhs.columnData.isEmpty() ?
+             (qAbs(gapWidth - rhs.gapWidth) <= 1E-10) :
+             (columnData == rhs.columnData));
+}
+
+bool KoColumns::operator!=(const KoColumns& rhs) const {
+    return
+        count != rhs.count ||
+        (columnData.isEmpty() && rhs.columnData.isEmpty() ?
+             qAbs(gapWidth - rhs.gapWidth) > 1E-10 :
+             ! (columnData == rhs.columnData));
+}
+
+void KoColumns::loadOdf(const KoXmlElement &style)
+{
+    KoXmlElement columnsElement = KoXml::namedItemNS(style, KoXmlNS::style, \
"columns"); +    if (!columnsElement.isNull()) {
+        count = columnsElement.attributeNS(KoXmlNS::fo, "column-count").toInt();
+        if (count < 1)
+            count = 1;
+        gapWidth = KoUnit::parseValue(columnsElement.attributeNS(KoXmlNS::fo, \
"column-gap")); +
+        KoXmlElement columnSep = KoXml::namedItemNS(columnsElement, KoXmlNS::style, \
"column-sep"); +        if (! columnSep.isNull()) {
+            separatorStyle = \
parseSeparatorStyle(columnSep.attributeNS(KoXmlNS::style, "style")); +            \
separatorWidth = KoUnit::parseValue(columnSep.attributeNS(KoXmlNS::style, "width")); \
+            separatorHeight = \
parseSeparatorHeight(columnSep.attributeNS(KoXmlNS::style, "height")); +            \
separatorColor = parseSeparatorColor(columnSep.attributeNS(KoXmlNS::style, "color")); \
+            separatorVerticalAlignment = +                \
parseSeparatorVerticalAlignment(columnSep.attributeNS(KoXmlNS::style, \
"vertical-align")); +        }
+
+        KoXmlElement columnElement;
+        forEachElement(columnElement, columnsElement) {
+            if(columnElement.localName() != QLatin1String("column") ||
+               columnElement.namespaceURI() != KoXmlNS::style)
+                continue;
+
+            ColumnDatum datum;
+            datum.leftMargin = \
KoUnit::parseValue(columnElement.attributeNS(KoXmlNS::fo, "start-indent"), 0.0); +    \
datum.rightMargin = KoUnit::parseValue(columnElement.attributeNS(KoXmlNS::fo, \
"end-indent"), 0.0); +            datum.topMargin = \
KoUnit::parseValue(columnElement.attributeNS(KoXmlNS::fo, "space-before"), 0.0); +    \
datum.bottomMargin = KoUnit::parseValue(columnElement.attributeNS(KoXmlNS::fo, \
"space-after"), 0.0); +            datum.relativeWidth = \
parseRelativeWidth(columnElement.attributeNS(KoXmlNS::style, "rel-width")); +         \
// on a bad relativeWidth just drop all data +            if (datum.relativeWidth <= \
0) { +                columnData.clear();
+                break;
+            }
+
+            columnData.append(datum);
+        }
+
+        if (! columnData.isEmpty() && count != columnData.count()) {
+            kWarning() << "Found not as many <style:column> elements as attribut \
fo:column-count has set:"<< count; +            columnData.clear();
+        }
+    } else {
+        reset();
+    }
+}
+
+void KoColumns::saveOdf(KoGenStyle &style) const
+{
+    if (count > 1) {
+        QBuffer buffer;
+        buffer.open(QIODevice::WriteOnly);
+        KoXmlWriter writer(&buffer);
+
+        writer.startElement("style:columns");
+        writer.addAttribute("fo:column-count", count);
+        if (columnData.isEmpty()) {
+            writer.addAttributePt("fo:column-gap", gapWidth);
+        }
+
+        if (separatorStyle != KoColumns::None) {
+            writer.startElement("style:column-sep");
+            writer.addAttribute("style:style", \
separatorStyleString(separatorStyle)); +            \
writer.addAttributePt("style:width", separatorWidth); +            \
writer.addAttribute("style:height", \
QString::number(separatorHeight)+QLatin1Char('%')); +            \
writer.addAttribute("style:color", separatorColor.name()); +            \
writer.addAttribute("style:vertical-align", \
separatorVerticalAlignmentString(separatorVerticalAlignment)); +            \
writer.endElement(); // style:column-sep +        }
+
+        foreach(const ColumnDatum &cd, columnData) {
+            writer.startElement("style:column");
+            writer.addAttributePt("fo:start-indent", cd.leftMargin);
+            writer.addAttributePt("fo:end-indent", cd.rightMargin);
+            writer.addAttributePt("fo:space-before", cd.topMargin);
+            writer.addAttributePt("fo:space-after", cd.bottomMargin);
+            writer.addAttribute("style:rel-width", \
QString::number(cd.relativeWidth)+QLatin1Char('*')); +            \
writer.endElement(); // style:column +        }
+
+        writer.endElement(); // style:columns
+
+        QString contentElement = QString::fromUtf8(buffer.buffer(), \
buffer.buffer().size()); +        style.addChildElement("style:columns", \
contentElement); +    }
+}
diff --git a/libs/odf/KoColumns.h b/libs/odf/KoColumns.h
index 6bd7267..ceb6f45 100644
--- a/libs/odf/KoColumns.h
+++ b/libs/odf/KoColumns.h
@@ -3,6 +3,7 @@
    Copyright 2002, 2003 David Faure <faure@kde.org>
    Copyright 2003 Nicolas GOUTTE <goutte@kde.org>
    Copyright 2007 Thomas Zander <zander@kde.org>
+   Copyright 2012 Friedrich W. H. Kossebau <kossebau@kde.org>
 
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
@@ -23,21 +24,113 @@
 #ifndef KOCOLUMNS_H
 #define KOCOLUMNS_H
 
+#include "koodf_export.h"
 
 #include <QtGlobal>
+#include <QColor>
+
+class KoGenStyle;
+class KoXmlElement;
+
 
 /** structure for columns */
 struct KoColumns {
-    int columns;
-    qreal columnSpacing;
-    bool operator==(const KoColumns& rhs) const {
-        return columns == rhs.columns &&
-               qAbs(columnSpacing - rhs.columnSpacing) <= 1E-10;
-    }
-    bool operator!=(const KoColumns& rhs) const {
-        return columns != rhs.columns ||
-               qAbs(columnSpacing - rhs.columnSpacing) > 1E-10;
+    enum SeparatorVerticalAlignment {
+        AlignTop = Qt::AlignTop,
+        AlignVCenter = Qt::AlignVCenter,
+        AlignBottom = Qt::AlignBottom
+    };
+
+    enum SeparatorStyle {
+        None = Qt::NoPen,
+        Solid = Qt::SolidLine,
+        Dashed = Qt::DashLine,
+        Dotted = Qt::DotLine,
+        DotDashed = Qt::DashDotLine
+    };
+
+    struct ColumnDatum
+    {
+        /** Left indent in points */
+        qreal leftMargin;
+        /** Right indent in points */
+        qreal rightMargin;
+        /** Top indent in points */
+        qreal topMargin;
+        /** Bottom indent in points */
+        qreal bottomMargin;
+
+        /** The relative width */
+        int relativeWidth;
+
+        ColumnDatum() {}
+        ColumnDatum(qreal lm, qreal rm, qreal tm, qreal bm, int rw)
+        : leftMargin(lm), rightMargin(rm), topMargin(tm), bottomMargin(bm), \
relativeWidth(rw) {} +
+        bool operator==(const KoColumns::ColumnDatum &rhs) const
+        {
+            return
+                (leftMargin == rhs.leftMargin) &&
+                (rightMargin == rhs.rightMargin) &&
+                (topMargin == rhs.topMargin) &&
+                (bottomMargin == rhs.bottomMargin) &&
+                (relativeWidth == rhs.relativeWidth);
+        }
+    };
+
+    /** Number of columns */
+    int count;
+
+    /** Spacing between columns in points */
+    qreal gapWidth;
+
+    SeparatorStyle separatorStyle;
+    QColor separatorColor;
+    SeparatorVerticalAlignment separatorVerticalAlignment;
+    /** Width in pt */
+    qreal separatorWidth;
+    /** Height in percent. Default is 100% */
+    unsigned int separatorHeight;
+
+    /** data about the individual columns if there  */
+    QList<ColumnDatum> columnData;
+
+    /**
+     * Construct a columns with the default column count 1,
+     * default margins (2 cm), and portrait orientation.
+     */
+    KOODF_EXPORT KoColumns();
+
+    KOODF_EXPORT void reset();
+    KOODF_EXPORT bool operator==(const KoColumns &l) const;
+    KOODF_EXPORT bool operator!=(const KoColumns &l) const;
+
+    /**
+     * Save this columns to ODF.
+     */
+    KOODF_EXPORT void saveOdf(KoGenStyle &style) const;
+
+    /**
+     * Load this columns from ODF
+     */
+    KOODF_EXPORT void loadOdf(const KoXmlElement &style);
+
+    qreal totalRelativeWidth() const
+    {
+        qreal result = 0.0;
+        foreach(const ColumnDatum &c, columnData) {
+            result += c.relativeWidth;
+        }
+        return result;
     }
+
+    KOODF_EXPORT static const char * separatorStyleString(KoColumns::SeparatorStyle \
separatorStyle); +    KOODF_EXPORT static const char * \
separatorVerticalAlignmentString(KoColumns::SeparatorVerticalAlignment \
separatorVerticalAlignment); +    KOODF_EXPORT static \
KoColumns::SeparatorVerticalAlignment parseSeparatorVerticalAlignment(const QString \
&value); +    KOODF_EXPORT static QColor parseSeparatorColor(const QString &value);
+    KOODF_EXPORT static int parseSeparatorHeight(const QString &value);
+    KOODF_EXPORT static KoColumns::SeparatorStyle parseSeparatorStyle(const QString \
&value); +    KOODF_EXPORT static int parseRelativeWidth(const QString &value);
 };
 
 #endif /* KOCOLUMNS_H */
diff --git a/libs/widgets/KoPagePreviewWidget.cpp \
b/libs/widgets/KoPagePreviewWidget.cpp index 8fe2c68..6626927 100644
--- a/libs/widgets/KoPagePreviewWidget.cpp
+++ b/libs/widgets/KoPagePreviewWidget.cpp
@@ -38,8 +38,6 @@ KoPagePreviewWidget::KoPagePreviewWidget(QWidget *parent)
     : QWidget(parent)
     , d(new Private)
 {
-    d->columns.columns = 1;
-    d->columns.columnSpacing = 0;
     setMinimumSize( 100, 100 );
 }
 
@@ -123,11 +121,31 @@ void KoPagePreviewWidget::drawPage(QPainter &painter, qreal \
                zoom, const QRect &d
     painter.setBrush( QBrush( palette().color(QPalette::ButtonText), Qt::HorPattern \
) );  painter.setPen( palette().color(QPalette::Dark) );
 
-    qreal columnWidth = (textArea.width() + (d->columns.columnSpacing * zoom)) / \
                d->columns.columns;
-    int width = qRound(columnWidth - d->columns.columnSpacing * zoom);
-    for ( int i = 0; i < d->columns.columns; ++i )
-        painter.drawRect( qRound(textArea.x() + i * columnWidth), textArea.y(), \
                width, textArea.height());
-
+    // uniform columns?
+    if (d->columns.columnData.isEmpty()) {
+        qreal columnWidth = (textArea.width() + (d->columns.gapWidth * zoom)) / \
d->columns.count; +        int width = qRound(columnWidth - d->columns.gapWidth * \
zoom); +        for ( int i = 0; i < d->columns.count; ++i )
+            painter.drawRect( qRound(textArea.x() + i * columnWidth), textArea.y(), \
width, textArea.height()); +    } else {
+        qreal totalRelativeWidth = 0.0;
+        foreach(const KoColumns::ColumnDatum &cd, d->columns.columnData) {
+            totalRelativeWidth += cd.relativeWidth;
+        }
+        int relativeColumnXOffset = 0;
+        for (int i = 0; i < d->columns.count; i++) {
+            const KoColumns::ColumnDatum &columnDatum = d->columns.columnData.at(i);
+            const qreal columnWidth = textArea.width() * columnDatum.relativeWidth / \
totalRelativeWidth; +            const qreal columnXOffset = textArea.width() * \
relativeColumnXOffset / totalRelativeWidth; +
+            painter.drawRect( qRound(textArea.x() + columnXOffset + \
columnDatum.leftMargin * zoom), +                              qRound(textArea.y()  + \
columnDatum.topMargin * zoom), +                              qRound(columnWidth - \
(columnDatum.leftMargin + columnDatum.rightMargin) * zoom), +                         \
qRound(textArea.height() - (columnDatum.topMargin + columnDatum.bottomMargin) * \
zoom)); +
+            relativeColumnXOffset += columnDatum.relativeWidth;
+        }
+    }
 }
 
 void KoPagePreviewWidget::setPageLayout(const KoPageLayout &layout)
diff --git a/words/part/KWDocument.cpp b/words/part/KWDocument.cpp
index 014e106..94a00c1 100644
--- a/words/part/KWDocument.cpp
+++ b/words/part/KWDocument.cpp
@@ -829,8 +829,7 @@ void KWDocument::removeFrameFromViews(KWFrame *frame)
 QList<KoDocument::CustomDocumentWidgetItem> \
KWDocument::createCustomDocumentWidgets(QWidget *parent)  {
     KoColumns columns;
-    columns.columns = 1;
-    columns.columnSpacing = m_config.defaultColumnSpacing();
+    columns.gapWidth = m_config.defaultColumnSpacing();
 
     QList<KoDocument::CustomDocumentWidgetItem> widgetList;
     KoDocument::CustomDocumentWidgetItem item;
diff --git a/words/part/KWPageStyle.cpp b/words/part/KWPageStyle.cpp
index ebc9103..0faab80 100644
--- a/words/part/KWPageStyle.cpp
+++ b/words/part/KWPageStyle.cpp
@@ -51,8 +51,7 @@ void KWPageStylePrivate::clear()
     headers = Words::HFTypeNone;
     footers = Words::HFTypeNone;
     pageUsage = KWPageStyle::AllPages;
-    columns.columns = 1;
-    columns.columnSpacing = 17; // ~ 6mm
+    columns.reset();
     direction = KoText::AutoDirection;
     headerDynamicSpacing = false;
     footerDynamicSpacing = false;
@@ -246,19 +245,8 @@ KoGenStyle KWPageStyle::saveOdf() const
     pageLayout.setAutoStyleInStylesDotXml(true);
     pageLayout.addAttribute("style:page-usage", "all");
 
-    if (d->columns.columns > 1) {
-        QBuffer buffer;
-        buffer.open(QIODevice::WriteOnly);
-        KoXmlWriter writer(&buffer);
-
-        writer.startElement("style:columns");
-        writer.addAttribute("fo:column-count", d->columns.columns);
-        writer.addAttributePt("fo:column-gap", d->columns.columnSpacing);
-        writer.endElement();
-
-        QString contentElement = QString::fromUtf8(buffer.buffer(), \
                buffer.buffer().size());
-        pageLayout.addChildElement("columnsEnzo", contentElement);
-    }
+    // save column data
+    d->columns.saveOdf(pageLayout);
 
     //<style:footnote-sep style:adjustment="left" style:width="0.5pt" \
style:rel-width="20%" style:line-style="solid"/>  \
//writer.startElement("style:footnote-sep"); @@ -333,16 +321,7 @@ void \
KWPageStyle::loadOdf(KoOdfLoadingContext &context, const KoXmlElement &mast  \
d->pageUsage = AllPages;  }
 
-    KoXmlElement columns = KoXml::namedItemNS(props, KoXmlNS::style, "columns");
-    if (!columns.isNull()) {
-        d->columns.columns = columns.attributeNS(KoXmlNS::fo, "column-count", \
                "15").toInt();
-        if (d->columns.columns < 1)
-            d->columns.columns = 1;
-        d->columns.columnSpacing = \
                KoUnit::parseValue(columns.attributeNS(KoXmlNS::fo, "column-gap"));
-    } else {
-        d->columns.columns = 1;
-        d->columns.columnSpacing = 17; // ~ 6mm
-    }
+    d->columns.loadOdf(props);
 
     KoXmlElement header = KoXml::namedItemNS(style, KoXmlNS::style, "header-style");
     if (! header.isNull()) {
diff --git a/words/part/KWRootAreaProvider.cpp b/words/part/KWRootAreaProvider.cpp
index d4a0a9b..9e28045 100644
--- a/words/part/KWRootAreaProvider.cpp
+++ b/words/part/KWRootAreaProvider.cpp
@@ -154,7 +154,7 @@ KoTextLayoutRootArea* \
                KWRootAreaProvider::provideNext(KoTextDocumentLayout *docu
     if (rootAreaPage && m_textFrameSet->textFrameSetType() == \
Words::MainTextFrameSet) {  Q_ASSERT(rootAreaPage->page.isValid());
         Q_ASSERT(rootAreaPage->page.pageStyle().isValid());
-        requiredRootAreaCount = rootAreaPage->page.pageStyle().columns().columns;
+        requiredRootAreaCount = rootAreaPage->page.pageStyle().columns().count;
     }
     if (rootAreaPage && rootAreaPage->rootAreas.count() < requiredRootAreaCount) {
         pageNumber = m_pages.count(); // the root-area is still on the same page
diff --git a/words/part/dialogs/KWDocumentColumns.cpp \
b/words/part/dialogs/KWDocumentColumns.cpp index f0ab3cf..9e0572b 100644
--- a/words/part/dialogs/KWDocumentColumns.cpp
+++ b/words/part/dialogs/KWDocumentColumns.cpp
@@ -35,6 +35,7 @@ KWDocumentColumns::KWDocumentColumns(QWidget *parent, const \
KoColumns &columns)  widget.previewPane->setLayout(layout);
     m_preview = new KoPagePreviewWidget(this);
     layout->addWidget(m_preview);
+    m_preview->setColumns(columns);
 
     connect(widget.columns, SIGNAL(valueChanged(int)), this, \
                SLOT(optionsChanged()));
     connect(widget.spacing, SIGNAL(valueChangedPt(qreal)), this, \
SLOT(optionsChanged())); @@ -44,8 +45,8 @@ \
KWDocumentColumns::KWDocumentColumns(QWidget *parent, const KoColumns &columns)  void \
KWDocumentColumns::setColumns(const KoColumns &columns)  {
     m_columns = columns;
-    widget.columns->setValue(columns.columns);
-    widget.spacing->changeValue(columns.columnSpacing);
+    widget.columns->setValue(columns.count);
+    widget.spacing->changeValue(columns.gapWidth);
 }
 
 void KWDocumentColumns::setTextAreaAvailable(bool available)
@@ -55,7 +56,7 @@ void KWDocumentColumns::setTextAreaAvailable(bool available)
     if (available)
         optionsChanged();
     else {
-        m_columns.columns = 1;
+        m_columns.count = 1;
         emit columnsChanged(m_columns);
     }
 }
@@ -67,8 +68,12 @@ void KWDocumentColumns::setUnit(const KoUnit &unit)
 
 void KWDocumentColumns::optionsChanged()
 {
-    m_columns.columns = widget.columns->value();
-    m_columns.columnSpacing = widget.spacing->value();
+    m_columns.count = widget.columns->value();
+    m_columns.gapWidth = widget.spacing->value();
+    // Workaround for currently incomplete support of column data:
+    // once some editing is done, drop any individual column data
+    // TODO: complete UI to set individual column data
+    m_columns.columnData.clear();
     emit columnsChanged(m_columns);
 }
 
diff --git a/words/part/frames/KWFrameLayout.cpp \
b/words/part/frames/KWFrameLayout.cpp index a99cfb8..d9675b0 100644
--- a/words/part/frames/KWFrameLayout.cpp
+++ b/words/part/frames/KWFrameLayout.cpp
@@ -4,6 +4,7 @@
  * Copyright (C) 2005-2006, 2009 Thomas Zander <zander@kde.org>
  * Copyright (C) 2008 Pierre Ducroquet <pinaraf@pinaraf.info>
  * Copyright (C) 2010 by Nokia, Matus Hanzes
+ * Copyright 2012 Friedrich W. H. Kossebau <kossebau@kde.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -158,7 +159,7 @@ void KWFrameLayout::createNewFramesForPage(int pageNumber)
     }
 
     // create main text frame. All columns of them.
-    int columns = page.pageStyle().columns().columns;
+    int columns = page.pageStyle().columns().count;
     Q_ASSERT(columns >= 1);
     KWTextFrameSet *fs = getOrCreate(Words::MainTextFrameSet, page);
     QRectF rect(QPointF(0, page.offsetInDocument()), QSizeF(page.width(), \
page.height())); @@ -230,19 +231,18 @@ void KWFrameLayout::layoutFramesOnPage(int \
                pageNumber)
                             - layout.leftPadding - layout.rightPadding;
 
     KWPageStyle pageStyle = page.pageStyle();
-    const int columns = pageStyle.columns().columns;
-    int columnsCount = columns;
+    KoColumns columns = pageStyle.columns();
     int columnIndex = 0;
     KWFrame **main;
     KWFrame *footer = 0, *header = 0;
     KWFrame *pageBackground = 0;
-    main = new KWFrame*[columnsCount];
-    if (columns > 0)
+    main = new KWFrame*[columns.count];
+    if (columns.count > 0)
         main[0] = 0;
     QRectF pageRect(left, page.offsetInDocument(), width, page.height());
     QList<KWFrame *> frames = framesInPage(pageRect);
 
-    kDebug(32001) << "pageNumber=" << pageNumber << "columns=" << \
pageStyle.columns().columns << "frameCount=" << frames.count(); +    kDebug(32001) << \
"pageNumber=" << pageNumber << "columns=" << columns.count << "frameCount=" << \
frames.count();  foreach (KWFrame *frame, frames) {
         KWTextFrameSet *textFrameSet = 0;
         switch (frame->frameSet()->type()) {
@@ -298,8 +298,8 @@ void KWFrameLayout::layoutFramesOnPage(int pageNumber)
             break;
         }
         case Words::MainTextFrameSet: {
-            if (columnIndex == columnsCount) {
-                kWarning(32001) << "Too many columns present on page, ignoring 1, \
columnsCount=" << columnsCount; +            if (columnIndex == columns.count) {
+                kWarning(32001) << "Too many columns present on page, ignoring 1, \
columns.count=" << columns.count;  break;
             }
             main[columnIndex] = frame;
@@ -320,9 +320,9 @@ void KWFrameLayout::layoutFramesOnPage(int pageNumber)
     pageBackground = frameOn(m_backgroundFrameSet, pageNumber);
 
     --minZIndex;
-    for (int i = 0; i < columns; ++i) {
-        Q_ASSERT_X(main[i], __FUNCTION__, QString("No KWFrame for column=%1 \
                columnCount=%2").arg(i).arg(columns).toLocal8Bit());
-        Q_ASSERT_X(main[i]->shape(), __FUNCTION__, QString("No TextShape in KWFrame \
for column=%1 columnCount=%2").arg(i).arg(columns).toLocal8Bit()); +    for (int i = \
0; i < columns.count; ++i) { +        Q_ASSERT_X(main[i], __FUNCTION__, QString("No \
KWFrame for column=%1 columnCount=%2").arg(i).arg(columns.count).toLocal8Bit()); +    \
Q_ASSERT_X(main[i]->shape(), __FUNCTION__, QString("No TextShape in KWFrame for \
column=%1 columnCount=%2").arg(i).arg(columns.count).toLocal8Bit());  if (main[i] && \
main[i]->shape())  main[i]->shape()->setZIndex(minZIndex);
     }
@@ -374,31 +374,62 @@ void KWFrameLayout::layoutFramesOnPage(int pageNumber)
     }
 
     // actually move / size the frames.
-    if (columns > 0 && main[0]) {
-        const qreal columnWidth = (textWidth
-                - page.pageStyle().columns().columnSpacing * (columns- 1 ))/ \
                columns;
-        const qreal columnStep = columnWidth + \
                page.pageStyle().columns().columnSpacing;
-        QPointF *points = new QPointF[columns];
-        for (int i = 0; i < columns; i++)
-            points[i] = QPointF(left + layout.leftMargin + layout.leftPadding \
                +columnStep * i, resultingPositions[3]);
-        for (int i = 0; i < columns; i++) {
-            for (int f = 0; f < columns; f++) {
+    if (columns.count > 0 && main[0]) {
+        const qreal fullColumnHeight = resultingPositions[4] - \
resultingPositions[3]; +        const qreal columnsXOffset = left + layout.leftMargin \
+ layout.leftPadding; +
+        QRectF *columnRects = new QRectF[columns.count];
+        // uniform columns?
+        if (columns.columnData.isEmpty()) {
+            const qreal columnWidth = (textWidth - columns.gapWidth * (columns.count \
- 1)) / columns.count; +            const qreal columnStep = columnWidth + \
columns.gapWidth; +
+            for (int i = 0; i < columns.count; i++) {
+                columnRects[i] = QRectF(
+                    columnsXOffset + columnStep * i,
+                    resultingPositions[3],
+                    columnWidth,
+                    fullColumnHeight);
+            }
+        } else {
+            qreal totalRelativeWidth = 0.0;
+            foreach(const KoColumns::ColumnDatum &cd, columns.columnData) {
+                totalRelativeWidth += cd.relativeWidth;
+            }
+            int relativeColumnXOffset = 0;
+            for (int i = 0; i < columns.count; i++) {
+                const KoColumns::ColumnDatum &columnDatum = \
columns.columnData.at(i); +                const qreal columnWidth = textWidth * \
columnDatum.relativeWidth / totalRelativeWidth; +                const qreal \
columnXOffset = textWidth * relativeColumnXOffset / totalRelativeWidth; +
+                columnRects[i] = QRectF(
+                    columnsXOffset + columnXOffset + columnDatum.leftMargin,
+                    resultingPositions[3] + columnDatum.topMargin,
+                    columnWidth - columnDatum.leftMargin - columnDatum.rightMargin,
+                    fullColumnHeight - columnDatum.topMargin - \
columnDatum.bottomMargin); +
+                relativeColumnXOffset += columnDatum.relativeWidth;
+            }
+        }
+        // what is this doing? Friedrich
+        for (int i = 0; i < columns.count; i++) {
+            for (int f = 0; f < columns.count; f++) {
                 if (f == i) continue;
-                if (qAbs(main[f]->shape()->position().x() - points[i].x()) < 10.0) {
+                if (qAbs(main[f]->shape()->position().x() - columnRects[i].x()) < \
10.0) {  qSwap(main[f], main[i]);
                     break;
                 }
             }
         }
 
-        for (int i = columns - 1; i >= 0; i--) {
+        for (int i = columns.count - 1; i >= 0; i--) {
             main[i]->setFrameBehavior(Words::AutoCreateNewFrameBehavior);
             main[i]->setNewFrameBehavior(Words::ReconnectNewFrame);
             KoShape *shape = main[i]->shape();
-            shape->setPosition(points[i]);
-            shape->setSize(QSizeF(columnWidth, resultingPositions[4] - \
resultingPositions[3])); +            shape->setPosition(columnRects[i].topLeft());
+            shape->setSize(columnRects[i].size());
         }
-        delete[] points;
+        delete[] columnRects;
 
         // We need to store the content rect so layout can place it's anchored \
shapes  // correctly
diff --git a/words/part/tests/TestFrameLayout.cpp \
b/words/part/tests/TestFrameLayout.cpp index 312e6ce..ae4d6db 100644
--- a/words/part/tests/TestFrameLayout.cpp
+++ b/words/part/tests/TestFrameLayout.cpp
@@ -267,7 +267,7 @@ void TestFrameLayout::testFrameCreation()
     QVERIFY(frameSets.evenFooters == 0);
 
     KoColumns columns = style.columns();
-    columns.columns = 2;
+    columns.count = 2;
     style.setColumns(columns);
 
     removeAllFrames();
@@ -368,8 +368,8 @@ void TestFrameLayout::testCreateNewFrameForPage()
     style4.setHasMainTextFrame(true);
     style4.setFooterPolicy(Words::HFTypeEvenOdd);
     KoColumns columns;
-    columns.columns = 2;
-    columns.columnSpacing = 4;
+    columns.count = 2;
+    columns.gapWidth = 4;
     style4.setColumns(columns);
     styles.insert(style4.name(), style4);
 
diff --git a/words/part/tests/TestPageCommands.cpp \
b/words/part/tests/TestPageCommands.cpp index 4f1f46f..a1983a4 100644
--- a/words/part/tests/TestPageCommands.cpp
+++ b/words/part/tests/TestPageCommands.cpp
@@ -450,8 +450,8 @@ void TestPageCommands::testPageStylePropertiesCommand() // basic \
properties chan  style.setPageLayout(oldLayout);
 
     KoColumns oldColumns;
-    oldColumns.columns = 4;
-    oldColumns.columnSpacing = 21;
+    oldColumns.count = 4;
+    oldColumns.gapWidth = 21;
     style.setColumns(oldColumns);
     KWPage page1 = manager->appendPage(style);
     page1.setDirectionHint(KoText::LeftRightTopBottom);
@@ -462,7 +462,7 @@ void TestPageCommands::testPageStylePropertiesCommand() // basic \
properties chan  QCOMPARE(page1.leftMargin(), 13.); // its a right-sided page
     QCOMPARE(page1.pageEdgeMargin(), 7.);
     QCOMPARE(page1.directionHint(), KoText::LeftRightTopBottom);
-    QCOMPARE(page1.pageStyle().columns().columns, 4);
+    QCOMPARE(page1.pageStyle().columns().count, 4);
     QCOMPARE(page1.pageSide(), KWPage::Right);
 
     // new ;)
@@ -476,8 +476,9 @@ void TestPageCommands::testPageStylePropertiesCommand() // basic \
properties chan  newLayout.bindingSide = -1;
     style2.setPageLayout(newLayout);
     KoColumns newColumns;
-    newColumns.columns = 2;
-    newColumns.columnSpacing = 12;
+    newColumns.count = 2;
+    newColumns.columnData.append(ColumnDatum(1.0, 2.0, 1.0, 1.0, 25));
+    newColumns.columnData.append(ColumnDatum(1.0, 1.0, 1.0, 1.0, 50));
     style2.setColumns(newColumns);
     style2.setDirection(KoText::RightLeftTopBottom);
 
@@ -502,7 +503,7 @@ void TestPageCommands::testPageStylePropertiesCommand() // basic \
                properties chan
     page1.setDirectionHint(KoText::InheritDirection); // reset to what the style \
says  QCOMPARE(page1.directionHint(), KoText::RightLeftTopBottom);
     QCOMPARE(style.pageLayout().width, 401.); // style changed
-    QCOMPARE(page1.pageStyle().columns().columns, 2);
+    QCOMPARE(page1.pageStyle().columns().count, 2);
     QCOMPARE(page1.pageNumber(), 1);
     QCOMPARE(page1.pageSide(), KWPage::Right);
 
@@ -526,7 +527,7 @@ void TestPageCommands::testPageStylePropertiesCommand() // basic \
properties chan  QCOMPARE(page1.leftMargin(), 13.);
     QCOMPARE(page1.directionHint(), KoText::AutoDirection);
     QCOMPARE(style.pageLayout().width, 101.);
-    QCOMPARE(page1.pageStyle().columns().columns, 4);
+    QCOMPARE(page1.pageStyle().columns().count, 4);
     QCOMPARE(page1.pageNumber(), 1);
     QCOMPARE(page1.pageSide(), KWPage::Right);
     QCOMPARE(manager->pageCount(), 2);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic