cui/source/dialogs/thesdlg.cxx | 36 +-- cui/source/inc/thesdlg.hxx | 9 vcl/inc/vcl/builder.hxx | 29 +++ vcl/source/window/builder.cxx | 387 ++++++++++++++++++++++++++++++++++++++--- vcl/source/window/window2.cxx | 23 -- 5 files changed, 407 insertions(+), 77 deletions(-)
New commits: commit e4cdeebc488e41d64cee1ccc531fc04ce727b03c Author: Caolán McNamara <caol...@redhat.com> Date: Tue Dec 11 09:33:45 2012 +0000 add popup menu support to .ui loader and hack up a mechanism to support menubuttons and map the popups to the menubuttons Change-Id: I6f3bd0e83b2c55f71aa85924fdc32d3a73ce0197 diff --git a/vcl/inc/vcl/builder.hxx b/vcl/inc/vcl/builder.hxx index e2793e6..4ca873f 100644 --- a/vcl/inc/vcl/builder.hxx +++ b/vcl/inc/vcl/builder.hxx @@ -21,6 +21,7 @@ class ListBox; class NumericFormatter; +class PopupMenu; class ScrollBar; class VclMultiLineEdit; @@ -56,6 +57,18 @@ private: }; std::vector<WinAndId> m_aChildren; + struct MenuAndId + { + OString m_sID; + PopupMenu *m_pMenu; + MenuAndId(const OString &rId, PopupMenu *pMenu) + : m_sID(rId) + , m_pMenu(pMenu) + { + } + }; + std::vector<MenuAndId> m_aMenus; + struct StringPair { OString m_sID; @@ -72,6 +85,7 @@ private: typedef StringPair ButtonImageWidgetMap; typedef StringPair TextBufferMap; typedef StringPair WidgetAdjustmentMap; + typedef StringPair ButtonMenuMap; struct ListStore { @@ -112,6 +126,8 @@ private: std::vector<ButtonImageWidgetMap> m_aButtonImageWidgetMaps; StockMap m_aStockMap; + std::vector<ButtonMenuMap> m_aButtonMenuMaps; + Translations m_aTranslations; std::map<Window*, Window*> m_aRedundantParentWidgets; @@ -131,6 +147,8 @@ private: Window *get_by_name(OString sID); void delete_by_name(OString sID); + PopupMenu *get_menu_by_name(OString sID); + class sortIntoBestTabTraversalOrder : public std::binary_function<const Window*, const Window*, bool> { @@ -168,6 +186,10 @@ public: } OString get_by_window(const Window *pWindow) const; void delete_by_window(const Window *pWindow); + + //Convert _ gtk markup to ~ vcl markup + static OString convertMnemonicMarkup(const OString &rIn); + private: Window *insertObject(Window *pParent, const OString &rClass, const OString &rID, stringmap &rProps, stringmap &rPangoAttributes); @@ -189,12 +211,19 @@ private: void applyPackingProperty(Window *pCurrent, xmlreader::XmlReader &reader); void collectProperty(xmlreader::XmlReader &reader, const OString &rID, stringmap &rVec); void collectPangoAttribute(xmlreader::XmlReader &reader, stringmap &rMap); + void collectAccelerator(xmlreader::XmlReader &reader, stringmap &rMap); + + void insertMenuObject(PopupMenu *pParent, const OString &rClass, const OString &rID, + stringmap &rProps, stringmap &rAccels); + void handleMenuChild(PopupMenu *pParent, xmlreader::XmlReader &reader); + void handleMenuObject(PopupMenu *pParent, xmlreader::XmlReader &reader); void handleListStore(xmlreader::XmlReader &reader, const OString &rID); void handleRow(xmlreader::XmlReader &reader, const OString &rID, sal_Int32 nRowIndex); void handleAdjustment(const OString &rID, stringmap &rProperties); void handleTextBuffer(const OString &rID, stringmap &rProperties); void handleTabChild(Window *pParent, xmlreader::XmlReader &reader); + void handleMenu(xmlreader::XmlReader &reader, const OString &rID); PackingData get_window_packing_data(const Window *pWindow) const; void set_window_packing_position(const Window *pWindow, sal_Int32 nPosition); diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 81467f6..39c5e0a 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -20,6 +20,7 @@ #include <vcl/layout.hxx> #include <vcl/lstbox.hxx> #include <vcl/menubtn.hxx> +#include <vcl/mnemonic.hxx> #include <vcl/prgsbar.hxx> #include <vcl/scrbar.hxx> #include <vcl/svapp.hxx> @@ -234,6 +235,19 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri delete_by_name(*aI); } + //Set button menus when everything has been imported + for (std::vector<ButtonMenuMap>::iterator aI = m_pParserState->m_aButtonMenuMaps.begin(), + aEnd = m_pParserState->m_aButtonMenuMaps.end(); aI != aEnd; ++aI) + { + MenuButton *pTarget = get<MenuButton>(aI->m_sID); + PopupMenu *pMenu = get_menu_by_name(aI->m_sValue); + SAL_WARN_IF(!pTarget || !pMenu, + "vcl", "missing elements of button/menu"); + if (!pTarget || !pMenu) + continue; + pTarget->SetPopupMenu(pMenu); + } + //Remove ScrollWindow parent widgets whose children in vcl implement scrolling //internally. for (std::map<Window*, Window*>::iterator aI = m_pParserState->m_aRedundantParentWidgets.begin(), @@ -257,6 +271,12 @@ VclBuilder::~VclBuilder() { delete aI->m_pWindow; } + + for (std::vector<MenuAndId>::reverse_iterator aI = m_aMenus.rbegin(), + aEnd = m_aMenus.rend(); aI != aEnd; ++aI) + { + delete aI->m_pMenu; + } } void VclBuilder::handleTranslations(xmlreader::XmlReader &reader) @@ -311,16 +331,16 @@ void VclBuilder::handleTranslations(xmlreader::XmlReader &reader) namespace { - OString extractPattern(VclBuilder::stringmap &rMap) + OString extractCustomProperty(VclBuilder::stringmap &rMap) { - OString sPattern; - VclBuilder::stringmap::iterator aFind = rMap.find(OString("pattern")); + OString sCustomProperty; + VclBuilder::stringmap::iterator aFind = rMap.find(OString("customproperty")); if (aFind != rMap.end()) { - sPattern = aFind->second; + sCustomProperty = aFind->second; rMap.erase(aFind); } - return sPattern; + return sCustomProperty; } bool extractResizable(VclBuilder::stringmap &rMap) @@ -397,10 +417,8 @@ namespace return OUString(); } - Window * extractStockAndBuildButton(Window *pParent, VclBuilder::stringmap &rMap) + bool extractStock(VclBuilder::stringmap &rMap) { - WinBits nBits = WB_CENTER|WB_VCENTER|WB_3DLOOK; - bool bIsStock = false; VclBuilder::stringmap::iterator aFind = rMap.find(OString("use-stock")); if (aFind != rMap.end()) @@ -408,19 +426,32 @@ namespace bIsStock = toBool(aFind->second); rMap.erase(aFind); } + return bIsStock; + } + + OString extractLabel(VclBuilder::stringmap &rMap) + { + OString sType; + VclBuilder::stringmap::iterator aFind = rMap.find(OString("label")); + if (aFind != rMap.end()) + { + sType = aFind->second; + rMap.erase(aFind); + } + return sType; + } + + Window * extractStockAndBuildPushButton(Window *pParent, VclBuilder::stringmap &rMap) + { + WinBits nBits = WB_CENTER|WB_VCENTER|WB_3DLOOK; + + bool bIsStock = extractStock(rMap); Window *pWindow = NULL; if (bIsStock) { - OString sType; - aFind = rMap.find(OString("label")); - if (aFind != rMap.end()) - { - sType = aFind->second; - rMap.erase(aFind); - } - + OString sType = extractLabel(rMap); if (sType == "gtk-ok") pWindow = new OKButton(pParent, nBits); else if (sType == "gtk-cancel") @@ -451,6 +482,20 @@ namespace return pWindow; } + Window * extractStockAndBuildMenuButton(Window *pParent, VclBuilder::stringmap &rMap) + { + WinBits nBits = WB_CENTER|WB_VCENTER|WB_3DLOOK; + + Window *pWindow = new MenuButton(pParent, nBits); + + if (extractStock(rMap)) + { + pWindow->SetText(getStockText(extractLabel(rMap))); + } + + return pWindow; + } + FieldUnit detectMetricUnit(OString sUnit) { FieldUnit eUnit = FUNIT_NONE; @@ -668,7 +713,14 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri else if (name == "GtkButton") { extractImage(id, rMap); - pWindow = extractStockAndBuildButton(pParent, rMap); + OString sMenu = extractCustomProperty(rMap); + if (sMenu.isEmpty()) + pWindow = extractStockAndBuildPushButton(pParent, rMap); + else + { + pWindow = extractStockAndBuildMenuButton(pParent, rMap); + m_pParserState->m_aButtonMenuMaps.push_back(ButtonMenuMap(id, sMenu)); + } } else if (name == "GtkRadioButton") { @@ -689,7 +741,7 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri else if (name == "GtkSpinButton") { extractSpinAdjustment(id, rMap); - OString sPattern = extractPattern(rMap); + OString sPattern = extractCustomProperty(rMap); OString sUnit = sPattern; for (sal_Int32 i = 0; i < sPattern.getLength(); ++i) @@ -988,7 +1040,7 @@ void VclBuilder::handleTabChild(Window *pParent, xmlreader::XmlReader &reader) if (nDelim != -1) { OString sPattern = sID.copy(nDelim+1); - aProperties[OString("pattern")] = sPattern; + aProperties[OString("customproperty")] = sPattern; sID = sID.copy(0, nDelim); } } @@ -1295,11 +1347,246 @@ void VclBuilder::handleListStore(xmlreader::XmlReader &reader, const OString &rI } } +void VclBuilder::handleMenu(xmlreader::XmlReader &reader, const OString &rID) +{ + PopupMenu *pCurrentMenu = new PopupMenu; + + int nLevel = 1; + + stringmap aProperties; + + while(1) + { + xmlreader::Span name; + int nsId; + + xmlreader::XmlReader::Result res = reader.nextItem( + xmlreader::XmlReader::TEXT_NONE, &name, &nsId); + + if (res == xmlreader::XmlReader::RESULT_DONE) + break; + + if (res == xmlreader::XmlReader::RESULT_BEGIN) + { + if (name.equals(RTL_CONSTASCII_STRINGPARAM("child"))) + { + handleMenuChild(pCurrentMenu, reader); + } + else + { + ++nLevel; + if (name.equals(RTL_CONSTASCII_STRINGPARAM("property"))) + collectProperty(reader, rID, aProperties); + } + } + + if (res == xmlreader::XmlReader::RESULT_END) + { + --nLevel; + } + + if (!nLevel) + break; + } + + m_aMenus.push_back(MenuAndId(rID, pCurrentMenu)); +} + +void VclBuilder::handleMenuChild(PopupMenu *pParent, xmlreader::XmlReader &reader) +{ + xmlreader::Span name; + int nsId; + OString sType; + + int nLevel = 1; + while(1) + { + 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")) || name.equals(RTL_CONSTASCII_STRINGPARAM("placeholder"))) + { + handleMenuObject(pParent, reader); + } + else + ++nLevel; + } + + if (res == xmlreader::XmlReader::RESULT_END) + --nLevel; + + if (!nLevel) + break; + + if (res == xmlreader::XmlReader::RESULT_DONE) + break; + } +} + +void VclBuilder::handleMenuObject(PopupMenu *pParent, xmlreader::XmlReader &reader) +{ + OString sClass; + OString sID; + OString sCustomProperty; + + xmlreader::Span name; + int nsId; + + while (reader.nextAttribute(&nsId, &name)) + { + if (name.equals(RTL_CONSTASCII_STRINGPARAM("class"))) + { + name = reader.getAttributeValue(false); + sClass = OString(name.begin, name.length); + } + else if (name.equals(RTL_CONSTASCII_STRINGPARAM("id"))) + { + name = reader.getAttributeValue(false); + sID = OString(name.begin, name.length); + sal_Int32 nDelim = sID.indexOf(':'); + if (nDelim != -1) + { + sCustomProperty = sID.copy(nDelim+1); + sID = sID.copy(0, nDelim); + } + } + } + + int nLevel = 1; + + stringmap aProperties, aAccelerators; + + if (!sCustomProperty.isEmpty()) + aProperties[OString("customproperty")] = sCustomProperty; + + while(1) + { + xmlreader::XmlReader::Result res = reader.nextItem( + xmlreader::XmlReader::TEXT_NONE, &name, &nsId); + + if (res == xmlreader::XmlReader::RESULT_DONE) + break; + + if (res == xmlreader::XmlReader::RESULT_BEGIN) + { + ++nLevel; + if (name.equals(RTL_CONSTASCII_STRINGPARAM("property"))) + collectProperty(reader, sID, aProperties); + else if (name.equals(RTL_CONSTASCII_STRINGPARAM("accelerator"))) + collectAccelerator(reader, aAccelerators); + } + + if (res == xmlreader::XmlReader::RESULT_END) + { + --nLevel; + } + + if (!nLevel) + break; + } + + insertMenuObject(pParent, sClass, sID, aProperties, aAccelerators); +} + +OString VclBuilder::convertMnemonicMarkup(const OString &rIn) +{ + OStringBuffer aRet(rIn); + for (sal_Int32 nI = 0; nI < aRet.getLength(); ++nI) + { + if (aRet[nI] == '_') + { + if (aRet[nI+1] != '_') + aRet[nI] = MNEMONIC_CHAR; + else + aRet.remove(nI, 1); + ++nI; + } + } + return aRet.makeStringAndClear(); +} + +namespace +{ + KeyCode makeKeyCode(const OString &rKey) + { + if (rKey == "Insert") + return KeyCode(KEY_INSERT); + else if (rKey == "Delete") + return KeyCode(KEY_DELETE); + + assert (rKey.getLength() == 1); + sal_Char cChar = rKey.toChar(); + + if (cChar >= 'a' && cChar <= 'z') + return KeyCode(KEY_A + (cChar - 'a')); + else if (cChar >= 'A' && cChar <= 'Z') + return KeyCode(KEY_A + (cChar - 'A')); + else if (cChar >= '0' && cChar <= '9') + return KeyCode(KEY_0 + (cChar - 'A')); + + return KeyCode(cChar); + } +} + +void VclBuilder::insertMenuObject(PopupMenu *pParent, const OString &rClass, const OString &rID, + stringmap &rProps, stringmap &rAccels) +{ + sal_uInt16 nOldCount = pParent->GetItemCount(); + sal_uInt16 nNewId = nOldCount + 1; + + if (rClass == "GtkMenuItem") + { + OUString sLabel(OStringToOUString(convertMnemonicMarkup(extractLabel(rProps)), RTL_TEXTENCODING_UTF8)); + pParent->InsertItem(nNewId, sLabel, MIB_TEXT); + } + else if (rClass == "GtkSeparatorMenuItem") + { + pParent->InsertSeparator(); + } + + SAL_WARN_IF(nOldCount == pParent->GetItemCount(), "vcl.layout", "probably need to implement " << rClass.getStr()); + + if (nOldCount != pParent->GetItemCount()) + { + pParent->SetHelpId(nNewId, m_sHelpRoot + rID); + + for (stringmap::iterator aI = rProps.begin(), aEnd = rProps.end(); aI != aEnd; ++aI) + { + const OString &rKey = aI->first; + const OString &rValue = aI->second; + + if (rKey == "tooltip-markup") + pParent->SetTipHelpText(nNewId, OStringToOUString(rValue, RTL_TEXTENCODING_UTF8)); + else if (rKey == "tooltip-text") + pParent->SetTipHelpText(nNewId, OStringToOUString(rValue, RTL_TEXTENCODING_UTF8)); + else if (rKey == "visible") + pParent->ShowItem(nNewId, toBool(rValue)); + else + SAL_INFO("vcl.layout", "unhandled property: " << rKey.getStr()); + } + + for (stringmap::iterator aI = rAccels.begin(), aEnd = rAccels.end(); aI != aEnd; ++aI) + { + const OString &rSignal = aI->first; + const OString &rValue = aI->second; + + if (rSignal == "activate") + pParent->SetAccelKey(nNewId, makeKeyCode(rValue)); + else + SAL_INFO("vcl.layout", "unhandled accelerator for: " << rSignal.getStr()); + } + } + + rProps.clear(); +} + Window* VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader) { OString sClass; OString sID; - OString sPattern; + OString sCustomProperty; xmlreader::Span name; int nsId; @@ -1318,7 +1605,7 @@ Window* VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader) sal_Int32 nDelim = sID.indexOf(':'); if (nDelim != -1) { - sPattern = sID.copy(nDelim+1); + sCustomProperty = sID.copy(nDelim+1); sID = sID.copy(0, nDelim); } } @@ -1329,13 +1616,18 @@ Window* VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader) handleListStore(reader, sID); return NULL; } + else if (sClass == "GtkMenu") + { + handleMenu(reader, sID); + return NULL; + } int nLevel = 1; stringmap aProperties, aPangoAttributes; - if (!sPattern.isEmpty()) - aProperties[OString("pattern")] = sPattern; + if (!sCustomProperty.isEmpty()) + aProperties[OString("customproperty")] = sCustomProperty; Window *pCurrentChild = NULL; while(1) @@ -1551,6 +1843,35 @@ void VclBuilder::collectProperty(xmlreader::XmlReader &reader, const OString &rI } } +void VclBuilder::collectAccelerator(xmlreader::XmlReader &reader, stringmap &rMap) +{ + xmlreader::Span name; + int nsId; + + OString sProperty; + OString sValue; + + while (reader.nextAttribute(&nsId, &name)) + { + if (name.equals(RTL_CONSTASCII_STRINGPARAM("key"))) + { + name = reader.getAttributeValue(false); + sValue = OString(name.begin, name.length); + } + else if (name.equals(RTL_CONSTASCII_STRINGPARAM("signal"))) + { + name = reader.getAttributeValue(false); + sProperty = OString(name.begin, name.length); + } + + } + + if (!sProperty.isEmpty() && !sValue.isEmpty()) + { + rMap[sProperty] = sValue; + } +} + Window *VclBuilder::get_widget_root() { return m_aChildren.empty() ? NULL : m_aChildren[0].m_pWindow; @@ -1568,6 +1889,18 @@ Window *VclBuilder::get_by_name(OString sID) return NULL; } +PopupMenu *VclBuilder::get_menu_by_name(OString sID) +{ + for (std::vector<MenuAndId>::iterator aI = m_aMenus.begin(), + aEnd = m_aMenus.end(); aI != aEnd; ++aI) + { + if (aI->m_sID.equals(sID)) + return aI->m_pMenu; + } + + return NULL; +} + void VclBuilder::delete_by_name(OString sID) { for (std::vector<WinAndId>::iterator aI = m_aChildren.begin(), diff --git a/vcl/source/window/window2.cxx b/vcl/source/window/window2.cxx index 051dfec..d7db958 100644 --- a/vcl/source/window/window2.cxx +++ b/vcl/source/window/window2.cxx @@ -28,7 +28,6 @@ #include <vcl/layout.hxx> #include <vcl/timer.hxx> #include <vcl/metric.hxx> -#include <vcl/mnemonic.hxx> #include <vcl/virdev.hxx> #include <vcl/window.hxx> #include <vcl/scrbar.hxx> @@ -1797,26 +1796,6 @@ namespace } } -namespace -{ - OString convertMnemonicMarkup(const OString &rIn) - { - OStringBuffer aRet(rIn); - for (sal_Int32 nI = 0; nI < aRet.getLength(); ++nI) - { - if (aRet[nI] == '_') - { - if (aRet[nI+1] != '_') - aRet[nI] = MNEMONIC_CHAR; - else - aRet.remove(nI, 1); - ++nI; - } - } - return aRet.makeStringAndClear(); - } -} - bool Window::set_font_attribute(const OString &rKey, const OString &rValue) { if (rKey == "weight") @@ -1872,7 +1851,7 @@ bool Window::set_property(const OString &rKey, const OString &rValue) (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("text"))) ) { - SetText(OStringToOUString(convertMnemonicMarkup(rValue), RTL_TEXTENCODING_UTF8)); + SetText(OStringToOUString(VclBuilder::convertMnemonicMarkup(rValue), RTL_TEXTENCODING_UTF8)); } else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("visible"))) Show(toBool(rValue)); commit 89d3780bbef785db53bafc623750bcba2ce25dc1 Author: Caolán McNamara <caol...@redhat.com> Date: Tue Dec 11 10:03:31 2012 +0000 use a ListBox instead of a MenuButton in the thesaurus dialog Change-Id: I0cbe7b4c6d329f2780cb3cac9bce6d722b7de469 diff --git a/cui/source/dialogs/thesdlg.cxx b/cui/source/dialogs/thesdlg.cxx index 0c4e1e0..54a80f1 100644 --- a/cui/source/dialogs/thesdlg.cxx +++ b/cui/source/dialogs/thesdlg.cxx @@ -341,20 +341,15 @@ IMPL_LINK( SvxThesaurusDialog, LeftBtnHdl_Impl, Button *, pBtn ) return 0; } -IMPL_LINK( SvxThesaurusDialog, LanguageHdl_Impl, MenuButton*, pBtn ) -{ - PopupMenu *pMenu = m_pLangMBtn->GetPopupMenu(); - if (pMenu && pBtn) - { - sal_uInt16 nItem = pBtn->GetCurItemId(); - String aLangText( pMenu->GetItemText( nItem ) ); - LanguageType nLang = SvtLanguageTable().GetType( aLangText ); - DBG_ASSERT( nLang != LANGUAGE_NONE && nLang != LANGUAGE_DONTKNOW, "failed to get language" ); - if (xThesaurus->hasLocale( LanguageTag( nLang ).getLocale() )) - nLookUpLanguage = nLang; - SetWindowTitle( nLang ); - LookUp_Impl(); - } +IMPL_LINK( SvxThesaurusDialog, LanguageHdl_Impl, ListBox*, pLB ) +{ + String aLangText( pLB->GetSelectEntry() ); + LanguageType nLang = SvtLanguageTable().GetType( aLangText ); + DBG_ASSERT( nLang != LANGUAGE_NONE && nLang != LANGUAGE_DONTKNOW, "failed to get language" ); + if (xThesaurus->hasLocale( LanguageTag( nLang ).getLocale() )) + nLookUpLanguage = nLang; + SetWindowTitle( nLang ); + LookUp_Impl(); return 0; } @@ -466,12 +461,12 @@ SvxThesaurusDialog::SvxThesaurusDialog( PushButton *pReplaceBtn = get<PushButton>("replace"); m_pReplaceEdit->init(pReplaceBtn); - get(m_pLangMBtn, "langcb"); + get(m_pLangLB, "langcb"); pReplaceBtn->SetClickHdl( LINK( this, SvxThesaurusDialog, ReplaceBtnHdl_Impl ) ); m_pLeftBtn->SetClickHdl( LINK( this, SvxThesaurusDialog, LeftBtnHdl_Impl ) ); m_pWordCB->SetSelectHdl( LINK( this, SvxThesaurusDialog, WordSelectHdl_Impl ) ); - m_pLangMBtn->SetSelectHdl( LINK( this, SvxThesaurusDialog, LanguageHdl_Impl ) ); + m_pLangLB->SetSelectHdl( LINK( this, SvxThesaurusDialog, LanguageHdl_Impl ) ); m_pAlternativesCT->SetSelectHdl( LINK( this, SvxThesaurusDialog, AlternativesSelectHdl_Impl )); m_pAlternativesCT->SetDoubleClickHdl( LINK( this, SvxThesaurusDialog, AlternativesDoubleClickHdl_Impl )); @@ -499,9 +494,7 @@ SvxThesaurusDialog::SvxThesaurusDialog( aLocales = xThesaurus->getLocales(); const sal_Int32 nLocales = aLocales.getLength(); const lang::Locale *pLocales = aLocales.getConstArray(); - PopupMenu* pMenu = m_pLangMBtn->GetPopupMenu(); - pMenu->Clear(); - pMenu->SetMenuFlags(MENU_FLAG_NOAUTOMNEMONICS); + m_pLangLB->Clear(); std::vector< OUString > aLangVec; for (sal_Int32 i = 0; i < nLocales; ++i) { @@ -511,13 +504,12 @@ SvxThesaurusDialog::SvxThesaurusDialog( } std::sort( aLangVec.begin(), aLangVec.end() ); for (size_t i = 0; i < aLangVec.size(); ++i) - pMenu->InsertItem( (sal_uInt16)i+1, aLangVec[i] ); // menu items should be enumerated from 1 and not 0 + m_pLangLB->InsertEntry( aLangVec[i] ); std::vector< OUString >::iterator aI = std::find(aLangVec.begin(), aLangVec.end(), aLangTab.GetString(nLanguage)); if (aI != aLangVec.end()) { - pMenu->SetSelectedEntry(std::distance(aLangVec.begin(), aI) + 1); - pMenu->Select(); + m_pLangLB->SelectEntry(*aI); } SetWindowTitle(nLanguage); diff --git a/cui/source/inc/thesdlg.hxx b/cui/source/inc/thesdlg.hxx index c27cf17..f8353ef 100644 --- a/cui/source/inc/thesdlg.hxx +++ b/cui/source/inc/thesdlg.hxx @@ -23,11 +23,10 @@ #include <com/sun/star/linguistic2/XThesaurus.hpp> #include <svx/checklbx.hxx> -#include <svx/stddlg.hxx> #include <vcl/button.hxx> #include <vcl/combobox.hxx> -#include <vcl/fixed.hxx> -#include <vcl/menubtn.hxx> +#include <vcl/lstbox.hxx> +#include <svx/stddlg.hxx> #include <memory> @@ -129,7 +128,7 @@ class SvxThesaurusDialog : public SvxStandardDialog LookUpComboBox* m_pWordCB; ThesaurusAlternativesCtrl* m_pAlternativesCT; ReplaceEdit* m_pReplaceEdit; - MenuButton* m_pLangMBtn; + ListBox* m_pLangLB; OUString m_aErrStr; @@ -146,7 +145,7 @@ public: // Handler DECL_LINK( ReplaceBtnHdl_Impl, Button * ); DECL_LINK( LeftBtnHdl_Impl, Button * ); - DECL_LINK( LanguageHdl_Impl, MenuButton * ); + DECL_LINK( LanguageHdl_Impl, ListBox * ); DECL_LINK( LookUpHdl_Impl, Button * ); DECL_LINK( WordSelectHdl_Impl, ComboBox * ); DECL_LINK( AlternativesSelectHdl_Impl, SvxCheckListBox * ); diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 596bf18..81467f6 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -740,11 +740,9 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri } else { - MenuButton *pMenuButton = new MenuButton(pParent, WB_LEFT|WB_VCENTER|WB_3DLOOK); - pMenuButton->mpOwnMenu = new PopupMenu; //this now belongs to the menubutton - pMenuButton->SetPopupMenu(pMenuButton->mpOwnMenu); - pMenuButton->SetShowDisplaySelectedItem(true); - pWindow = pMenuButton; + ListBox *pListBox = new ListBox(pParent, WB_LEFT|WB_DROPDOWN|WB_VCENTER|WB_3DLOOK); + pListBox->EnableAutoSize(true); + pWindow = pListBox; } } else if (name == "GtkTreeView")
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits