[Libreoffice-commits] .: Branch 'feature/cmclayout' - vcl/inc vcl/qa vcl/source
Caolán McNamara
caolan at kemper.freedesktop.org
Tue Mar 27 06:20:36 PDT 2012
vcl/inc/vcl/builder.hxx | 8 +
vcl/qa/cppunit/builder/demo.ui | 84 ++++++++++++++
vcl/source/window/builder.cxx | 232 +++++++++++++++++++++++++++++------------
3 files changed, 253 insertions(+), 71 deletions(-)
New commits:
commit b40e05451d2c03cb857e56396ad101e7b1f57bbf
Author: Caolán McNamara <caolanm at redhat.com>
Date: Tue Mar 27 14:20:17 2012 +0100
labels, radio buttons, vbox, hbox, button-boxes, text alignment
diff --git a/vcl/inc/vcl/builder.hxx b/vcl/inc/vcl/builder.hxx
index 4c2ce32..9e7197a 100644
--- a/vcl/inc/vcl/builder.hxx
+++ b/vcl/inc/vcl/builder.hxx
@@ -31,21 +31,25 @@
#include <vcl/dllapi.h>
#include <vcl/window.hxx>
#include <xmlreader/xmlreader.hxx>
+#include <map>
#include <vector>
class VCL_DLLPUBLIC VclBuilder
{
private:
std::vector<Window*> m_aChildren;
+ typedef std::map<rtl::OString, rtl::OString> stringmap;
public:
VclBuilder(Window *pParent, rtl::OUString sUIFile);
~VclBuilder();
Window *get_widget_root();
private:
- Window *makeObject(Window *pParent, xmlreader::Span &name);
+ Window *insertObject(Window *pParent, const rtl::OString &rClass, stringmap &rVec);
+ Window *makeObject(Window *pParent, const rtl::OString &rClass, bool bVertical=false);
+ void handleChild(Window *pParent, xmlreader::XmlReader &reader);
void handleObject(Window *pParent, xmlreader::XmlReader &reader);
- void handleProperty(Window *pWindow, xmlreader::XmlReader &reader);
+ void collectProperty(xmlreader::XmlReader &reader, stringmap &rVec);
};
#endif
diff --git a/vcl/qa/cppunit/builder/demo.ui b/vcl/qa/cppunit/builder/demo.ui
index d6bd41b..92904e7 100644
--- a/vcl/qa/cppunit/builder/demo.ui
+++ b/vcl/qa/cppunit/builder/demo.ui
@@ -10,6 +10,48 @@
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="button3">
+ <property name="label" translatable="yes">button</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="radiobutton1">
+ <property name="label" translatable="yes">radiobutton</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area1">
<property name="can_focus">False</property>
@@ -51,10 +93,48 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="label1">
+ <object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">Hello World</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">left</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">right</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">center</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 0378ea9..5bb7b28 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -14,7 +14,7 @@
*
* The Initial Developer of the Original Code is
* Caolán McNamara <caolanm at redhat.com> (Red Hat, Inc.)
- * Portions created by the Initial Developer are Copyright (C) 2011 the
+ * Portions created by the Initial Developer are Copyright (C) 2012 the
* Initial Developer. All Rights Reserved.
*
* Contributor(s): Caolán McNamara <caolanm at redhat.com>
@@ -36,24 +36,7 @@ VclBuilder::VclBuilder(Window *pParent, rtl::OUString sUri)
{
xmlreader::XmlReader reader(sUri);
- while(1)
- {
- xmlreader::Span name;
- int nsId;
- xmlreader::XmlReader::Result res = reader.nextItem(
- xmlreader::XmlReader::TEXT_NONE, &name, &nsId);
-
- if (res == xmlreader::XmlReader::RESULT_BEGIN &&
- name.equals(RTL_CONSTASCII_STRINGPARAM("object")))
- {
- handleObject(pParent, reader);
- }
-
- rtl::OString sFoo(name.begin, name.length);
- fprintf(stderr, "interface level is %s\n", sFoo.getStr());
- if (res == xmlreader::XmlReader::RESULT_DONE)
- break;
- }
+ handleChild(pParent, reader);
for (std::vector<Window*>::iterator aI = m_aChildren.begin(),
aEnd = m_aChildren.end(); aI != aEnd; ++aI)
@@ -76,56 +59,111 @@ VclBuilder::~VclBuilder()
}
}
-Window *VclBuilder::makeObject(Window *pParent, xmlreader::Span &name)
+Window *VclBuilder::makeObject(Window *pParent, const rtl::OString &name, bool bVertical)
{
Window *pWindow = NULL;
- if (name.equals(RTL_CONSTASCII_STRINGPARAM("GtkDialog")))
+ if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkDialog")))
{
pWindow = new Dialog(pParent, WB_SIZEMOVE);
}
- else if (name.equals(RTL_CONSTASCII_STRINGPARAM("GtkBox")))
+ else if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkBox")))
+ {
+ if (bVertical)
+ pWindow = new VclVBox(pParent);
+ else
+ pWindow = new VclHBox(pParent);
+ }
+ else if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkButtonBox")))
+ {
+ if (bVertical)
+ pWindow = new VclVButtonBox(pParent);
+ else
+ pWindow = new VclHButtonBox(pParent);
+ }
+ else if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkButton")))
{
- pWindow = new VclHBox(pParent);
+ pWindow = new PushButton(pParent, WB_CENTER|WB_VCENTER);
}
- else if (name.equals(RTL_CONSTASCII_STRINGPARAM("GtkButton")))
+ else if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkRadioButton")))
{
- pWindow = new PushButton(pParent);
+ pWindow = new RadioButton(pParent, WB_CENTER|WB_VCENTER);
}
- else if (name.equals(RTL_CONSTASCII_STRINGPARAM("GtkLabel")))
+ else if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkLabel")))
{
- pWindow = new FixedText(pParent);
+ pWindow = new FixedText(pParent, WB_CENTER|WB_VCENTER);
}
else
{
- fprintf(stderr, "TO-DO, implement %s\n",
- rtl::OString(name.begin, name.length).getStr());
+ fprintf(stderr, "TO-DO, implement %s\n", name.getStr());
}
- fprintf(stderr, "created %p child of %p\n", pWindow, pParent);
+ fprintf(stderr, "for %s, created %p child of %p\n", name.getStr(), pWindow, pParent);
return pWindow;
}
-void VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader)
+Window *VclBuilder::insertObject(Window *pParent, const rtl::OString &rClass, stringmap &rMap)
{
- Window *pCurrentChild = NULL;
+ bool bVertical = false;
+ stringmap::iterator aFind = rMap.find(rtl::OString(RTL_CONSTASCII_STRINGPARAM("orientation")));
+ if (aFind != rMap.end())
+ bVertical = aFind->second.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("vertical"));
- xmlreader::Span name;
- int nsId;
+ Window *pCurrentChild = makeObject(pParent, rClass, bVertical);
+ if (!pCurrentChild)
+ {
+ fprintf(stderr, "missing object!\n");
+ }
- while (reader.nextAttribute(&nsId, &name)) {
- rtl::OString sFoo(name.begin, name.length);
- fprintf(stderr, "objectlevel attribute: is %s\n", sFoo.getStr());
+ if (pCurrentChild)
+ {
+ m_aChildren.push_back(pCurrentChild);
- if (name.equals(RTL_CONSTASCII_STRINGPARAM("class")))
+ for (stringmap::iterator aI = rMap.begin(), aEnd = rMap.end(); aI != aEnd; ++aI)
{
- name = reader.getAttributeValue(false);
- pCurrentChild = makeObject(pParent, name);
- if (!pCurrentChild)
+ const rtl::OString &rKey = aI->first;
+ const rtl::OString &rValue = aI->second;
+ if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("label")))
+ pCurrentChild->SetText(rtl::OStringToOUString(rValue, RTL_TEXTENCODING_UTF8));
+ else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("xalign")))
{
- fprintf(stderr, "missing object!\n");
+ WinBits nBits = pCurrentChild->GetStyle();
+ nBits &= ~(WB_LEFT | WB_CENTER | WB_RIGHT);
+
+ float f = rValue.toFloat();
+ if (f == 0.0)
+ nBits |= WB_LEFT;
+ else if (f == 1.0)
+ nBits |= WB_RIGHT;
+ else if (f == 0.5)
+ nBits |= WB_CENTER;
+
+ pCurrentChild->SetStyle(nBits);
}
+ else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("yalign")))
+ {
+ WinBits nBits = pCurrentChild->GetStyle();
+ nBits &= ~(WB_TOP | WB_VCENTER | WB_BOTTOM);
- if (pCurrentChild)
- m_aChildren.push_back(pCurrentChild);
+ float f = rValue.toFloat();
+ if (f == 0.0)
+ nBits |= WB_TOP;
+ else if (f == 1.0)
+ nBits |= WB_BOTTOM;
+ else if (f == 0.5)
+ nBits |= WB_CENTER;
+
+ pCurrentChild->SetStyle(nBits);
+ }
+ else if
+ (
+ rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("expand")) ||
+ rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("fill"))
+ )
+ {
+ bool bTrue = (rValue[0] == 't' || rValue[0] == 'T' || rValue[0] == '1');
+ pCurrentChild->setChildProperty(rKey, bTrue);
+ }
+ else
+ fprintf(stderr, "unhandled property %s\n", rKey.getStr());
}
}
@@ -134,34 +172,93 @@ void VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader)
fprintf(stderr, "missing object!\n");
pCurrentChild = m_aChildren.empty() ? pParent : m_aChildren.back();
}
+ rMap.clear();
+ return pCurrentChild;
+}
+void VclBuilder::handleChild(Window *pParent, xmlreader::XmlReader &reader)
+{
int nLevel = 1;
while(1)
{
+ xmlreader::Span name;
+ int nsId;
xmlreader::XmlReader::Result res = reader.nextItem(
xmlreader::XmlReader::TEXT_NONE, &name, &nsId);
+ if (res == xmlreader::XmlReader::RESULT_BEGIN)
+ {
+ if (name.equals(RTL_CONSTASCII_STRINGPARAM("object")))
+ {
+ handleObject(pParent, reader);
+ }
+ else
+ ++nLevel;
+ }
+
+ if (res == xmlreader::XmlReader::RESULT_END)
+ {
+ --nLevel;
+ }
+
+ if (!nLevel)
+ break;
+
if (res == xmlreader::XmlReader::RESULT_DONE)
break;
+ }
+}
- rtl::OString sFoo(name.begin, name.length);
- fprintf(stderr, "objectlevel: is %s %d\n", sFoo.getStr(),
- res);
+void VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader)
+{
+ rtl::OString sClass;
- if (res == xmlreader::XmlReader::RESULT_BEGIN)
- ++nLevel;
+ xmlreader::Span name;
+ int nsId;
+
+ while (reader.nextAttribute(&nsId, &name))
+ {
+ rtl::OString sFoo(name.begin, name.length);
- if (res == xmlreader::XmlReader::RESULT_BEGIN &&
- name.equals(RTL_CONSTASCII_STRINGPARAM("object")))
+ if (name.equals(RTL_CONSTASCII_STRINGPARAM("class")))
{
- handleObject(pCurrentChild, reader);
+ name = reader.getAttributeValue(false);
+ sClass = rtl::OString(name.begin, name.length);
}
+ }
+
+ int nLevel = 1;
+
+ stringmap aProperties;
- if (res == xmlreader::XmlReader::RESULT_BEGIN &&
- name.equals(RTL_CONSTASCII_STRINGPARAM("property")))
+ Window *pCurrentChild = NULL;
+ while(1)
+ {
+ xmlreader::XmlReader::Result res = reader.nextItem(
+ xmlreader::XmlReader::TEXT_NONE, &name, &nsId);
+
+ if (res == xmlreader::XmlReader::RESULT_DONE)
+ break;
+
+ rtl::OString sFoo(name.begin, name.length);
+
+ fprintf(stderr, "level tag %d %s\n", nLevel, sFoo.getStr());
+
+ if (res == xmlreader::XmlReader::RESULT_BEGIN)
{
- handleProperty(pCurrentChild, reader);
+ if (name.equals(RTL_CONSTASCII_STRINGPARAM("child")))
+ {
+ if (!pCurrentChild)
+ pCurrentChild = insertObject(pParent, sClass, aProperties);
+ handleChild(pCurrentChild, reader);
+ }
+ else
+ {
+ ++nLevel;
+ if (name.equals(RTL_CONSTASCII_STRINGPARAM("property")))
+ collectProperty(reader, aProperties);
+ }
}
if (res == xmlreader::XmlReader::RESULT_END)
@@ -172,29 +269,30 @@ void VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader)
if (!nLevel)
break;
}
+
+ if (!pCurrentChild)
+ insertObject(pParent, sClass, aProperties);
+
+ fprintf(stderr, "finished %s\n", sClass.getStr());
}
-void VclBuilder::handleProperty(Window *pWindow, xmlreader::XmlReader &reader)
+void VclBuilder::collectProperty(xmlreader::XmlReader &reader, stringmap &rMap)
{
- if (!pWindow)
- return;
-
xmlreader::Span name;
int nsId;
- while (reader.nextAttribute(&nsId, &name)) {
+ while (reader.nextAttribute(&nsId, &name))
+ {
rtl::OString sFoo(name.begin, name.length);
- fprintf(stderr, "property attribute: is %s\n", sFoo.getStr());
if (name.equals(RTL_CONSTASCII_STRINGPARAM("name")))
{
name = reader.getAttributeValue(false);
- if (name.equals(RTL_CONSTASCII_STRINGPARAM("label")))
- {
- reader.nextItem(
- xmlreader::XmlReader::TEXT_NORMALIZED, &name, &nsId);
- pWindow->SetText(rtl::OUString(name.begin, name.length, RTL_TEXTENCODING_UTF8));
- }
+ rtl::OString sProperty(name.begin, name.length);
+ reader.nextItem(
+ xmlreader::XmlReader::TEXT_NORMALIZED, &name, &nsId);
+ rtl::OString sValue(name.begin, name.length);
+ rMap[sProperty] = sValue;
}
}
}
More information about the Libreoffice-commits
mailing list