[Libreoffice-commits] core.git: include/vcl vcl/source
Caolán McNamara
caolanm at redhat.com
Mon Jan 30 13:46:50 UTC 2017
include/vcl/builder.hxx | 5 ++--
vcl/source/window/builder.cxx | 47 +++++++++++++++++++++++++-----------------
2 files changed, 32 insertions(+), 20 deletions(-)
New commits:
commit 06d8a9d436d39b56b27757312ad802021f9e6737
Author: Caolán McNamara <caolanm at redhat.com>
Date: Mon Jan 30 13:42:11 2017 +0000
support accelerator modifiers in menu builder
Change-Id: I39c4260ecec288be61f4f2c42c5b7c72babdb7a8
diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx
index e849ee5d..0577372 100644
--- a/include/vcl/builder.hxx
+++ b/include/vcl/builder.hxx
@@ -49,6 +49,7 @@ class VCL_DLLPUBLIC VclBuilder
{
public:
typedef std::map<OString, OString> stringmap;
+ typedef std::map<OString, std::pair<OString, OString>> accelmap;
/// These functions create a new widget with parent pParent and return it in rRet
typedef void (*customMakeWidget)(VclPtr<vcl::Window> &rRet, VclPtr<vcl::Window> &pParent, stringmap &rVec);
@@ -361,14 +362,14 @@ private:
void collectProperty(xmlreader::XmlReader &reader, const OString &rID, stringmap &rVec);
static void collectPangoAttribute(xmlreader::XmlReader &reader, stringmap &rMap);
static void collectAtkAttribute(xmlreader::XmlReader &reader, stringmap &rMap);
- static void collectAccelerator(xmlreader::XmlReader &reader, stringmap &rMap);
+ static void collectAccelerator(xmlreader::XmlReader &reader, accelmap &rMap);
void insertMenuObject(
PopupMenu *pParent,
const OString &rClass,
const OString &rID,
stringmap &rProps,
- stringmap &rAccels);
+ accelmap &rAccels);
void handleMenuChild(PopupMenu *pParent, xmlreader::XmlReader &reader);
void handleMenuObject(PopupMenu *pParent, xmlreader::XmlReader &reader);
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 32bd8b8..fd8d0e0 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -2579,7 +2579,8 @@ void VclBuilder::handleMenuObject(PopupMenu *pParent, xmlreader::XmlReader &read
int nLevel = 1;
- stringmap aProperties, aAccelerators;
+ stringmap aProperties;
+ accelmap aAccelerators;
if (!sCustomProperty.isEmpty())
aProperties[OString("customproperty")] = sCustomProperty;
@@ -2685,29 +2686,34 @@ OString VclBuilder::convertMnemonicMarkup(const OString &rIn)
namespace
{
- vcl::KeyCode makeKeyCode(const OString &rKey)
+ vcl::KeyCode makeKeyCode(const std::pair<OString,OString> &rKey)
{
- if (rKey == "Insert")
- return vcl::KeyCode(KEY_INSERT);
- else if (rKey == "Delete")
- return vcl::KeyCode(KEY_DELETE);
+ bool bShift = rKey.second.indexOf("GDK_SHIFT_MASK") != -1;
+ bool bMod1 = rKey.second.indexOf("GDK_CONTROL_MASK") != -1;
+ bool bMod2 = rKey.second.indexOf("GDK_MOD1_MASK") != -1;
+ bool bMod3 = rKey.second.indexOf("GDK_MOD2_MASK") != -1;
+
+ if (rKey.first == "Insert")
+ return vcl::KeyCode(KEY_INSERT, bShift, bMod1, bMod2, bMod3);
+ else if (rKey.first == "Delete")
+ return vcl::KeyCode(KEY_DELETE, bShift, bMod1, bMod2, bMod3);
- assert (rKey.getLength() == 1);
- sal_Char cChar = rKey.toChar();
+ assert (rKey.first.getLength() == 1);
+ sal_Char cChar = rKey.first.toChar();
if (cChar >= 'a' && cChar <= 'z')
- return vcl::KeyCode(KEY_A + (cChar - 'a'));
+ return vcl::KeyCode(KEY_A + (cChar - 'a'), bShift, bMod1, bMod2, bMod3);
else if (cChar >= 'A' && cChar <= 'Z')
- return vcl::KeyCode(KEY_A + (cChar - 'A'));
+ return vcl::KeyCode(KEY_A + (cChar - 'A'), bShift, bMod1, bMod2, bMod3);
else if (cChar >= '0' && cChar <= '9')
- return vcl::KeyCode(KEY_0 + (cChar - 'A'));
+ return vcl::KeyCode(KEY_0 + (cChar - 'A'), bShift, bMod1, bMod2, bMod3);
- return vcl::KeyCode(cChar);
+ return vcl::KeyCode(cChar, bShift, bMod1, bMod2, bMod3);
}
}
void VclBuilder::insertMenuObject(PopupMenu *pParent, const OString &rClass, const OString &rID,
- stringmap &rProps, stringmap &rAccels)
+ stringmap &rProps, accelmap &rAccels)
{
sal_uInt16 nOldCount = pParent->GetItemCount();
sal_uInt16 nNewId = nOldCount + 1;
@@ -2745,10 +2751,10 @@ void VclBuilder::insertMenuObject(PopupMenu *pParent, const OString &rClass, con
SAL_INFO("vcl.layout", "unhandled property: " << rKey.getStr());
}
- for (stringmap::iterator aI = rAccels.begin(), aEnd = rAccels.end(); aI != aEnd; ++aI)
+ for (accelmap::iterator aI = rAccels.begin(), aEnd = rAccels.end(); aI != aEnd; ++aI)
{
const OString &rSignal = aI->first;
- const OString &rValue = aI->second;
+ const auto &rValue = aI->second;
if (rSignal == "activate")
pParent->SetAccelKey(nNewId, makeKeyCode(rValue));
@@ -3206,13 +3212,14 @@ void VclBuilder::handleActionWidget(xmlreader::XmlReader &reader)
set_response(sID, sResponse.toInt32());
}
-void VclBuilder::collectAccelerator(xmlreader::XmlReader &reader, stringmap &rMap)
+void VclBuilder::collectAccelerator(xmlreader::XmlReader &reader, accelmap &rMap)
{
xmlreader::Span name;
int nsId;
OString sProperty;
OString sValue;
+ OString sModifiers;
while (reader.nextAttribute(&nsId, &name))
{
@@ -3226,12 +3233,16 @@ void VclBuilder::collectAccelerator(xmlreader::XmlReader &reader, stringmap &rMa
name = reader.getAttributeValue(false);
sProperty = OString(name.begin, name.length);
}
-
+ else if (name.equals("modifiers"))
+ {
+ name = reader.getAttributeValue(false);
+ sModifiers = OString(name.begin, name.length);
+ }
}
if (!sProperty.isEmpty() && !sValue.isEmpty())
{
- rMap[sProperty] = sValue;
+ rMap[sProperty] = std::make_pair(sValue, sModifiers);
}
}
More information about the Libreoffice-commits
mailing list