[Libreoffice-commits] core.git: vcl/inc vcl/qa vcl/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Mon Mar 4 20:20:47 UTC 2019
vcl/inc/widgetdraw/WidgetDefinition.hxx | 48 +++++-
vcl/inc/widgetdraw/WidgetDefinitionReader.hxx | 5
vcl/qa/cppunit/widgetdraw/WidgetDefinitionReaderTest.cxx | 8 -
vcl/source/gdi/FileDefinitionWidgetDraw.cxx | 6
vcl/source/gdi/WidgetDefinition.cxx | 110 --------------
vcl/source/gdi/WidgetDefinitionReader.cxx | 117 +++++++++++++--
6 files changed, 158 insertions(+), 136 deletions(-)
New commits:
commit 9671ac2dac00c21ae840cb29c2671b22ab95a7b2
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Fri Jan 25 23:10:57 2019 +0100
Commit: Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Mon Mar 4 21:20:24 2019 +0100
Refactor so we have only one definition map and ControlTypeAndPart
Until now we had multiple maps, each for a specific ControlType
(maPushButtonDefinitions for example) which had multiple parts
identified by the string.
To simplify matters, this changes that we have just one map for
a specific ControlType and ControlPart which are identified by
ControlTypeAndPart structure.
Change-Id: I90a2e5c8f83d697d26049054eacab250e2768c03
Reviewed-on: https://gerrit.libreoffice.org/68690
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
diff --git a/vcl/inc/widgetdraw/WidgetDefinition.hxx b/vcl/inc/widgetdraw/WidgetDefinition.hxx
index 423ab1d970c3..486d61802654 100644
--- a/vcl/inc/widgetdraw/WidgetDefinition.hxx
+++ b/vcl/inc/widgetdraw/WidgetDefinition.hxx
@@ -17,6 +17,9 @@
#include <tools/color.hxx>
#include <unordered_map>
#include <vector>
+#include <cstddef>
+#include <functional>
+#include <boost/functional/hash.hpp>
#include <vcl/salnativewidgets.hxx>
namespace vcl
@@ -83,6 +86,42 @@ public:
}
};
+struct VCL_DLLPUBLIC ControlTypeAndPart
+{
+ ControlType const meType;
+ ControlPart const mePart;
+
+ ControlTypeAndPart(ControlType eType, ControlPart ePart)
+ : meType(eType)
+ , mePart(ePart)
+ {
+ }
+
+ bool operator==(ControlTypeAndPart const& aOther) const
+ {
+ return meType == aOther.meType && mePart == aOther.mePart;
+ }
+};
+
+} // end vcl namespace
+
+namespace std
+{
+template <> struct VCL_DLLPUBLIC hash<vcl::ControlTypeAndPart>
+{
+ std::size_t operator()(vcl::ControlTypeAndPart const& rControlTypeAndPart) const noexcept
+ {
+ std::size_t seed = 0;
+ boost::hash_combine(seed, rControlTypeAndPart.meType);
+ boost::hash_combine(seed, rControlTypeAndPart.mePart);
+ return seed;
+ }
+};
+
+} // end std namespace
+
+namespace vcl
+{
class VCL_DLLPUBLIC WidgetDefinitionState
{
public:
@@ -171,13 +210,8 @@ public:
Color maToolTextColor;
Color maFontColor;
- std::unordered_map<OString, std::shared_ptr<WidgetDefinitionPart>> maPushButtonDefinitions;
- std::unordered_map<OString, std::shared_ptr<WidgetDefinitionPart>> maRadioButtonDefinitions;
- std::unordered_map<OString, std::shared_ptr<WidgetDefinitionPart>> maEditboxDefinitions;
-
- std::shared_ptr<WidgetDefinitionPart> getPushButtonDefinition(ControlPart ePart);
- std::shared_ptr<WidgetDefinitionPart> getRadioButtonDefinition(ControlPart ePart);
- std::shared_ptr<WidgetDefinitionPart> getEditboxDefinition(ControlPart ePart);
+ std::unordered_map<ControlTypeAndPart, std::shared_ptr<WidgetDefinitionPart>> maDefinitions;
+ std::shared_ptr<WidgetDefinitionPart> getDefinition(ControlType eType, ControlPart ePart);
};
} // end vcl namespace
diff --git a/vcl/inc/widgetdraw/WidgetDefinitionReader.hxx b/vcl/inc/widgetdraw/WidgetDefinitionReader.hxx
index 1cb577c08c4d..53da5e1a3bed 100644
--- a/vcl/inc/widgetdraw/WidgetDefinitionReader.hxx
+++ b/vcl/inc/widgetdraw/WidgetDefinitionReader.hxx
@@ -24,9 +24,8 @@ class VCL_DLLPUBLIC WidgetDefinitionReader
private:
OUString m_rFilePath;
- static void
- readDefinition(tools::XmlWalker& rWalker,
- std::unordered_map<OString, std::shared_ptr<WidgetDefinitionPart>>& rDefinition);
+ static void readDefinition(tools::XmlWalker& rWalker, WidgetDefinition& rWidgetDefinition,
+ ControlType eType);
static void readPart(tools::XmlWalker& rWalker, std::shared_ptr<WidgetDefinitionPart> rpPart);
diff --git a/vcl/qa/cppunit/widgetdraw/WidgetDefinitionReaderTest.cxx b/vcl/qa/cppunit/widgetdraw/WidgetDefinitionReaderTest.cxx
index 54ac184651ca..6f64c95ebd7a 100644
--- a/vcl/qa/cppunit/widgetdraw/WidgetDefinitionReaderTest.cxx
+++ b/vcl/qa/cppunit/widgetdraw/WidgetDefinitionReaderTest.cxx
@@ -54,9 +54,10 @@ void WidgetDefinitionReaderTest::testRead()
CPPUNIT_ASSERT_EQUAL(OUString("ffffff"), aDefinition.maToolTextColor.AsRGBHexString());
CPPUNIT_ASSERT_EQUAL(OUString("ffffff"), aDefinition.maFontColor.AsRGBHexString());
+ // Pushbutton
{
std::vector<std::shared_ptr<vcl::WidgetDefinitionState>> aStates
- = aDefinition.getPushButtonDefinition(ControlPart::Entire)
+ = aDefinition.getDefinition(ControlType::Pushbutton, ControlPart::Entire)
->getStates(ControlState::DEFAULT | ControlState::ENABLED
| ControlState::ROLLOVER,
ImplControlValue());
@@ -69,9 +70,10 @@ void WidgetDefinitionReaderTest::testRead()
CPPUNIT_ASSERT_EQUAL(vcl::DrawCommandType::CIRCLE, aStates[0]->mpDrawCommands[1]->maType);
}
+ // Radiobutton
{
std::vector<std::shared_ptr<vcl::WidgetDefinitionState>> aStates
- = aDefinition.getRadioButtonDefinition(ControlPart::Entire)
+ = aDefinition.getDefinition(ControlType::Radiobutton, ControlPart::Entire)
->getStates(ControlState::NONE, ImplControlValue(ButtonValue::On));
CPPUNIT_ASSERT_EQUAL(size_t(1), aStates.size());
CPPUNIT_ASSERT_EQUAL(size_t(2), aStates[0]->mpDrawCommands.size());
@@ -79,7 +81,7 @@ void WidgetDefinitionReaderTest::testRead()
{
std::vector<std::shared_ptr<vcl::WidgetDefinitionState>> aStates
- = aDefinition.getRadioButtonDefinition(ControlPart::Entire)
+ = aDefinition.getDefinition(ControlType::Radiobutton, ControlPart::Entire)
->getStates(ControlState::NONE, ImplControlValue(ButtonValue::Off));
CPPUNIT_ASSERT_EQUAL(size_t(1), aStates.size());
CPPUNIT_ASSERT_EQUAL(size_t(1), aStates[0]->mpDrawCommands.size());
diff --git a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
index c28967eb9b7f..9b4aa8a8c8c9 100644
--- a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
+++ b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
@@ -197,7 +197,7 @@ bool FileDefinitionWidgetDraw::drawNativeControl(ControlType eType, ControlPart
case ControlType::Pushbutton:
{
std::shared_ptr<WidgetDefinitionPart> pPart
- = m_aWidgetDefinition.getPushButtonDefinition(ePart);
+ = m_aWidgetDefinition.getDefinition(eType, ePart);
if (pPart)
{
auto aStates = pPart->getStates(eState, rValue);
@@ -216,7 +216,7 @@ bool FileDefinitionWidgetDraw::drawNativeControl(ControlType eType, ControlPart
case ControlType::Radiobutton:
{
std::shared_ptr<WidgetDefinitionPart> pPart
- = m_aWidgetDefinition.getRadioButtonDefinition(ePart);
+ = m_aWidgetDefinition.getDefinition(eType, ePart);
if (pPart)
{
std::shared_ptr<WidgetDefinitionState> pState
@@ -236,7 +236,7 @@ bool FileDefinitionWidgetDraw::drawNativeControl(ControlType eType, ControlPart
case ControlType::MultilineEditbox:
{
std::shared_ptr<WidgetDefinitionPart> pPart
- = m_aWidgetDefinition.getEditboxDefinition(ePart);
+ = m_aWidgetDefinition.getDefinition(eType, ePart);
if (pPart)
{
std::shared_ptr<WidgetDefinitionState> pState
diff --git a/vcl/source/gdi/WidgetDefinition.cxx b/vcl/source/gdi/WidgetDefinition.cxx
index e5fc5e8ae8f2..36d362479c27 100644
--- a/vcl/source/gdi/WidgetDefinition.cxx
+++ b/vcl/source/gdi/WidgetDefinition.cxx
@@ -16,114 +16,12 @@
namespace vcl
{
-namespace
+std::shared_ptr<WidgetDefinitionPart> WidgetDefinition::getDefinition(ControlType eType,
+ ControlPart ePart)
{
-OString xmlControlPart(ControlPart ePart)
-{
- switch (ePart)
- {
- case ControlPart::NONE:
- return "NONE";
- case ControlPart::Entire:
- return "Entire";
- case ControlPart::ListboxWindow:
- return "ListboxWindow";
- case ControlPart::Button:
- return "NONE";
- case ControlPart::ButtonUp:
- return "NONE";
- case ControlPart::ButtonDown:
- return "NONE";
- case ControlPart::ButtonLeft:
- return "NONE";
- case ControlPart::ButtonRight:
- return "NONE";
- case ControlPart::AllButtons:
- return "NONE";
- case ControlPart::SeparatorHorz:
- return "NONE";
- case ControlPart::SeparatorVert:
- return "NONE";
- case ControlPart::TrackHorzLeft:
- return "NONE";
- case ControlPart::TrackVertUpper:
- return "NONE";
- case ControlPart::TrackHorzRight:
- return "NONE";
- case ControlPart::TrackVertLower:
- return "NONE";
- case ControlPart::TrackHorzArea:
- return "NONE";
- case ControlPart::TrackVertArea:
- return "NONE";
- case ControlPart::Arrow:
- return "NONE";
- case ControlPart::ThumbHorz:
- return "NONE";
- case ControlPart::ThumbVert:
- return "NONE";
- case ControlPart::MenuItem:
- return "NONE";
- case ControlPart::MenuItemCheckMark:
- return "NONE";
- case ControlPart::MenuItemRadioMark:
- return "NONE";
- case ControlPart::Separator:
- return "NONE";
- case ControlPart::SubmenuArrow:
- return "NONE";
- case ControlPart::SubEdit:
- return "NONE";
- case ControlPart::DrawBackgroundHorz:
- return "NONE";
- case ControlPart::DrawBackgroundVert:
- return "NONE";
- case ControlPart::TabsDrawRtl:
- return "NONE";
- case ControlPart::HasBackgroundTexture:
- return "NONE";
- case ControlPart::HasThreeButtons:
- return "NONE";
- case ControlPart::BackgroundWindow:
- return "NONE";
- case ControlPart::BackgroundDialog:
- return "NONE";
- case ControlPart::Border:
- return "NONE";
- case ControlPart::Focus:
- return "FOCUS";
-
- default:
- break;
- }
- return "NONE";
-}
-
-} // end anonymous namespace
-
-std::shared_ptr<WidgetDefinitionPart> WidgetDefinition::getPushButtonDefinition(ControlPart ePart)
-{
- auto aIterator = maPushButtonDefinitions.find(xmlControlPart(ePart));
-
- if (aIterator != maPushButtonDefinitions.end())
- return aIterator->second;
- return std::shared_ptr<WidgetDefinitionPart>();
-}
-
-std::shared_ptr<WidgetDefinitionPart> WidgetDefinition::getRadioButtonDefinition(ControlPart ePart)
-{
- auto aIterator = maRadioButtonDefinitions.find(xmlControlPart(ePart));
-
- if (aIterator != maRadioButtonDefinitions.end())
- return aIterator->second;
- return std::shared_ptr<WidgetDefinitionPart>();
-}
-
-std::shared_ptr<WidgetDefinitionPart> WidgetDefinition::getEditboxDefinition(ControlPart ePart)
-{
- auto aIterator = maEditboxDefinitions.find(xmlControlPart(ePart));
+ auto aIterator = maDefinitions.find(ControlTypeAndPart(eType, ePart));
- if (aIterator != maEditboxDefinitions.end())
+ if (aIterator != maDefinitions.end())
return aIterator->second;
return std::shared_ptr<WidgetDefinitionPart>();
}
diff --git a/vcl/source/gdi/WidgetDefinitionReader.cxx b/vcl/source/gdi/WidgetDefinitionReader.cxx
index e9c40d46a2fd..bc9ce749dfad 100644
--- a/vcl/source/gdi/WidgetDefinitionReader.cxx
+++ b/vcl/source/gdi/WidgetDefinitionReader.cxx
@@ -55,6 +55,102 @@ bool readColor(OString const& rString, Color& rColor)
return true;
}
+ControlPart xmlStringToControlPart(OString const& sPart)
+{
+ if (sPart.equalsIgnoreAsciiCase("NONE"))
+ return ControlPart::NONE;
+ else if (sPart.equalsIgnoreAsciiCase("Entire"))
+ return ControlPart::Entire;
+ else if (sPart.equalsIgnoreAsciiCase("ListboxWindow"))
+ return ControlPart::ListboxWindow;
+ else if (sPart.equalsIgnoreAsciiCase("Button"))
+ return ControlPart::Button;
+ else if (sPart.equalsIgnoreAsciiCase("ButtonUp"))
+ return ControlPart::ButtonUp;
+ else if (sPart.equalsIgnoreAsciiCase("ButtonDown"))
+ return ControlPart::ButtonDown;
+ else if (sPart.equalsIgnoreAsciiCase("ButtonLeft"))
+ return ControlPart::ButtonLeft;
+ else if (sPart.equalsIgnoreAsciiCase("ButtonRight"))
+ return ControlPart::ButtonRight;
+ else if (sPart.equalsIgnoreAsciiCase("AllButtons"))
+ return ControlPart::AllButtons;
+ else if (sPart.equalsIgnoreAsciiCase("SeparatorHorz"))
+ return ControlPart::SeparatorHorz;
+ else if (sPart.equalsIgnoreAsciiCase("SeparatorVert"))
+ return ControlPart::SeparatorVert;
+ else if (sPart.equalsIgnoreAsciiCase("TrackHorzLeft"))
+ return ControlPart::TrackHorzLeft;
+ else if (sPart.equalsIgnoreAsciiCase("TrackVertUpper"))
+ return ControlPart::TrackVertUpper;
+ else if (sPart.equalsIgnoreAsciiCase("TrackHorzRight"))
+ return ControlPart::TrackHorzRight;
+ else if (sPart.equalsIgnoreAsciiCase("TrackVertLower"))
+ return ControlPart::TrackVertLower;
+ else if (sPart.equalsIgnoreAsciiCase("TrackHorzArea"))
+ return ControlPart::TrackHorzArea;
+ else if (sPart.equalsIgnoreAsciiCase("TrackVertArea"))
+ return ControlPart::TrackVertArea;
+ else if (sPart.equalsIgnoreAsciiCase("Arrow"))
+ return ControlPart::Arrow;
+ else if (sPart.equalsIgnoreAsciiCase("ThumbHorz"))
+ return ControlPart::ThumbHorz;
+ else if (sPart.equalsIgnoreAsciiCase("ThumbVert"))
+ return ControlPart::ThumbVert;
+ else if (sPart.equalsIgnoreAsciiCase("MenuItem"))
+ return ControlPart::MenuItem;
+ else if (sPart.equalsIgnoreAsciiCase("MenuItemCheckMark"))
+ return ControlPart::MenuItemCheckMark;
+ else if (sPart.equalsIgnoreAsciiCase("MenuItemRadioMark"))
+ return ControlPart::MenuItemRadioMark;
+ else if (sPart.equalsIgnoreAsciiCase("Separator"))
+ return ControlPart::Separator;
+ else if (sPart.equalsIgnoreAsciiCase("SubmenuArrow"))
+ return ControlPart::SubmenuArrow;
+ else if (sPart.equalsIgnoreAsciiCase("SubEdit"))
+ return ControlPart::SubEdit;
+ else if (sPart.equalsIgnoreAsciiCase("DrawBackgroundHorz"))
+ return ControlPart::DrawBackgroundHorz;
+ else if (sPart.equalsIgnoreAsciiCase("DrawBackgroundVert"))
+ return ControlPart::DrawBackgroundVert;
+ else if (sPart.equalsIgnoreAsciiCase("TabsDrawRtl"))
+ return ControlPart::TabsDrawRtl;
+ else if (sPart.equalsIgnoreAsciiCase("HasBackgroundTexture"))
+ return ControlPart::HasBackgroundTexture;
+ else if (sPart.equalsIgnoreAsciiCase("HasThreeButtons"))
+ return ControlPart::HasThreeButtons;
+ else if (sPart.equalsIgnoreAsciiCase("BackgroundWindow"))
+ return ControlPart::BackgroundWindow;
+ else if (sPart.equalsIgnoreAsciiCase("BackgroundDialog"))
+ return ControlPart::BackgroundDialog;
+ else if (sPart.equalsIgnoreAsciiCase("Border"))
+ return ControlPart::Border;
+ else if (sPart.equalsIgnoreAsciiCase("Focus"))
+ return ControlPart::Focus;
+ return ControlPart::NONE;
+}
+
+bool getControlTypeForXmlString(OString const& rString, ControlType& reType)
+{
+ bool bReturn = false;
+ if (rString == "pushbutton")
+ {
+ reType = ControlType::Pushbutton;
+ bReturn = true;
+ }
+ else if (rString == "radiobutton")
+ {
+ reType = ControlType::Radiobutton;
+ bReturn = true;
+ }
+ else if (rString == "editbox")
+ {
+ reType = ControlType::Editbox;
+ bReturn = true;
+ }
+ return bReturn;
+}
+
} // end anonymous namespace
WidgetDefinitionReader::WidgetDefinitionReader(OUString const& rFilePath)
@@ -144,9 +240,8 @@ void WidgetDefinitionReader::readDrawingDefinition(tools::XmlWalker& rWalker,
rWalker.parent();
}
-void WidgetDefinitionReader::readDefinition(
- tools::XmlWalker& rWalker,
- std::unordered_map<OString, std::shared_ptr<WidgetDefinitionPart>>& rPart)
+void WidgetDefinitionReader::readDefinition(tools::XmlWalker& rWalker,
+ WidgetDefinition& rWidgetDefinition, ControlType eType)
{
rWalker.children();
while (rWalker.isValid())
@@ -154,8 +249,9 @@ void WidgetDefinitionReader::readDefinition(
if (rWalker.name() == "part")
{
OString sPart = rWalker.attribute("value");
+ ControlPart ePart = xmlStringToControlPart(sPart);
std::shared_ptr<WidgetDefinitionPart> pPart = std::make_shared<WidgetDefinitionPart>();
- rPart.emplace(sPart, pPart);
+ rWidgetDefinition.maDefinitions.emplace(ControlTypeAndPart(eType, ePart), pPart);
readPart(rWalker, pPart);
}
rWalker.next();
@@ -259,6 +355,7 @@ bool WidgetDefinitionReader::read(WidgetDefinition& rWidgetDefinition)
aWalker.children();
while (aWalker.isValid())
{
+ ControlType eType;
if (aWalker.name() == "style")
{
aWalker.children();
@@ -273,17 +370,9 @@ bool WidgetDefinitionReader::read(WidgetDefinition& rWidgetDefinition)
}
aWalker.parent();
}
- else if (aWalker.name() == "pushbutton")
- {
- readDefinition(aWalker, rWidgetDefinition.maPushButtonDefinitions);
- }
- else if (aWalker.name() == "radiobutton")
- {
- readDefinition(aWalker, rWidgetDefinition.maRadioButtonDefinitions);
- }
- else if (aWalker.name() == "editbox")
+ else if (getControlTypeForXmlString(aWalker.name(), eType))
{
- readDefinition(aWalker, rWidgetDefinition.maEditboxDefinitions);
+ readDefinition(aWalker, rWidgetDefinition, eType);
}
aWalker.next();
}
More information about the Libreoffice-commits
mailing list