summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Holesovsky <kendy@collabora.com>2014-09-22 11:45:37 +0200
committerJan Holesovsky <kendy@collabora.com>2014-09-22 11:57:00 +0200
commit8da21eca455134a1d017893a9b1d26f827fba185 (patch)
treeff6012cf56cc67eaf9b2ea37fe24249adeebca11
parentb66dc3cd84c7031a0df75e9d782edebbaca6fdf1 (diff)
vcl: Allow creation of button content from action name (.uno: commands).
Change-Id: If4b2aef59d45a848fb77de9e1b7bf80d49548a75
-rw-r--r--framework/source/layoutmanager/layoutmanager.cxx10
-rw-r--r--include/vcl/builder.hxx11
-rw-r--r--include/vcl/menu.hxx3
-rw-r--r--include/vcl/syswin.hxx2
-rw-r--r--vcl/source/window/builder.cxx127
-rw-r--r--vcl/source/window/menu.cxx2
-rw-r--r--vcl/source/window/syswin.cxx4
-rw-r--r--vcl/source/window/toolbox2.cxx105
8 files changed, 148 insertions, 116 deletions
diff --git a/framework/source/layoutmanager/layoutmanager.cxx b/framework/source/layoutmanager/layoutmanager.cxx
index 89d1fe472dbc..a9fad1ae8898 100644
--- a/framework/source/layoutmanager/layoutmanager.cxx
+++ b/framework/source/layoutmanager/layoutmanager.cxx
@@ -770,7 +770,7 @@ void LayoutManager::implts_updateUIElementsVisibleState( bool bSetVisible )
if ( pSysWindow )
{
if ( bSetVisible )
- pSysWindow->SetMenuBar( pMenuBar );
+ pSysWindow->SetMenuBar(pMenuBar, m_xFrame);
else
pSysWindow->SetMenuBar( 0 );
bMustDoLayout = true;
@@ -1154,7 +1154,7 @@ throw (uno::RuntimeException)
SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow );
if ( pSysWindow )
- pSysWindow->SetMenuBar(pMenuBar);
+ pSysWindow->SetMenuBar(pMenuBar, m_xFrame);
m_bInplaceMenuSet = true;
m_xInplaceMenuBar = Reference< XComponent >( (OWeakObject *)m_pInplaceMenuBar, UNO_QUERY );
@@ -1181,7 +1181,7 @@ throw (uno::RuntimeException)
if ( pSysWindow )
{
if ( pMenuBarWrapper )
- pSysWindow->SetMenuBar((MenuBar *)pMenuBarWrapper->GetMenuBarManager()->GetMenuBar());
+ pSysWindow->SetMenuBar((MenuBar *)pMenuBarWrapper->GetMenuBarManager()->GetMenuBar(), m_xFrame);
else
pSysWindow->SetMenuBar(0);
}
@@ -1489,7 +1489,7 @@ throw (RuntimeException, std::exception)
MenuBar* pMenuBar = (MenuBar*)pAwtMenuBar->GetMenu();
if ( pMenuBar )
{
- pSysWindow->SetMenuBar( pMenuBar );
+ pSysWindow->SetMenuBar(pMenuBar, m_xFrame);
pMenuBar->SetDisplayable( m_bMenuVisible );
if ( m_bMenuVisible )
bNotify = true;
@@ -2574,7 +2574,7 @@ bool LayoutManager::implts_resetMenuBar()
SystemWindow* pSysWindow = getTopSystemWindow( xContainerWindow );
if ( pSysWindow && bMenuVisible && pSetMenuBar )
{
- pSysWindow->SetMenuBar( pSetMenuBar );
+ pSysWindow->SetMenuBar(pSetMenuBar, m_xFrame);
pSetMenuBar->SetDisplayable( true );
return true;
}
diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx
index baa77d367f54..f9adddb84585 100644
--- a/include/vcl/builder.hxx
+++ b/include/vcl/builder.hxx
@@ -29,6 +29,7 @@
#include <boost/ptr_container/ptr_map.hpp>
#include <com/sun/star/frame/XFrame.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
class ListBox;
class NumericFormatter;
@@ -258,7 +259,7 @@ private:
public:
VclBuilder(::Window *pParent, const OUString& sUIRootDir, const OUString& sUIFile,
const OString& sID = OString(),
- const com::sun::star::uno::Reference<com::sun::star::frame::XFrame> &rFrame = com::sun::star::uno::Reference<com::sun::star::frame::XFrame>());
+ const css::uno::Reference<css::frame::XFrame> &rFrame = css::uno::Reference<css::frame::XFrame>());
~VclBuilder();
::Window *get_widget_root();
//sID must exist and be of type T
@@ -324,6 +325,14 @@ public:
static void reorderWithinParent(std::vector< ::Window*>& rChilds, bool bIsButtonBox);
static void reorderWithinParent(::Window &rWindow, sal_uInt16 nNewPosition);
+ /// Get label of the command (like of .uno:Save) from the description service
+ static OUString getCommandLabel(const OUString& rCommand, const css::uno::Reference<css::uno::XComponentContext>& rContext, const OUString& rModuleId);
+
+ /// Get image of the command (like of .uno:Save) from the description service
+ static Image getCommandImage(const OUString& rCommand, bool bLarge,
+ const css::uno::Reference<css::uno::XComponentContext>& rContext, const css::uno::Reference<css::frame::XFrame>& rFrame,
+ const OUString& rModuleId);
+
css::uno::Reference<css::frame::XFrame> getFrame() { return m_xFrame; }
private:
::Window *insertObject(::Window *pParent,
diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx
index de5dea0c101d..77313014bde8 100644
--- a/include/vcl/menu.hxx
+++ b/include/vcl/menu.hxx
@@ -29,6 +29,7 @@
#include <vcl/bitmapex.hxx>
#include <vcl/keycod.hxx>
#include <vcl/vclevent.hxx>
+#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/uno/Reference.hxx>
struct ImplSVEvent;
@@ -407,7 +408,7 @@ class VCL_DLLPUBLIC MenuBar : public Menu
friend class MenuFloatingWindow;
friend class SystemWindow;
- SAL_DLLPRIVATE static Window* ImplCreate( Window* pParent, Window* pWindow, MenuBar* pMenu );
+ SAL_DLLPRIVATE static Window* ImplCreate(Window* pParent, Window* pWindow, MenuBar* pMenu, const css::uno::Reference<css::frame::XFrame> &rFrame);
SAL_DLLPRIVATE static void ImplDestroy( MenuBar* pMenu, bool bDelete );
SAL_DLLPRIVATE bool ImplHandleKeyEvent( const KeyEvent& rKEvent, bool bFromMenu = true );
diff --git a/include/vcl/syswin.hxx b/include/vcl/syswin.hxx
index ce79e114a8a1..382e9b1e2c03 100644
--- a/include/vcl/syswin.hxx
+++ b/include/vcl/syswin.hxx
@@ -224,7 +224,7 @@ public:
void SetWindowState(const OString& rStr);
OString GetWindowState(sal_uLong nMask = WINDOWSTATE_MASK_ALL) const;
- void SetMenuBar( MenuBar* pMenuBar );
+ void SetMenuBar(MenuBar* pMenuBar, const css::uno::Reference<css::frame::XFrame>& rFrame = css::uno::Reference<css::frame::XFrame>());
MenuBar* GetMenuBar() const { return mpMenuBar; }
void SetMenuBarMode( sal_uInt16 nMode );
sal_uInt16 GetMenuBarMode() const { return mnMenuBarMode; }
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 0bfc4e737ee2..824fd177b1b1 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -7,7 +7,16 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
+#include <com/sun/star/frame/ModuleManager.hpp>
+#include <com/sun/star/frame/XModuleManager2.hpp>
+#include <com/sun/star/frame/theUICommandDescription.hpp>
#include <com/sun/star/packages/zip/ZipFileAccess.hpp>
+#include <com/sun/star/ui/ImageType.hpp>
+#include <com/sun/star/ui/XImageManager.hpp>
+#include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
+#include <com/sun/star/ui/XUIConfigurationManager.hpp>
+#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
+#include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
#include <comphelper/processfactory.hxx>
#include <osl/module.hxx>
@@ -144,7 +153,7 @@ void VclBuilder::loadTranslations(const LanguageTag &rLanguageTag, const OUStrin
handleTranslations(reader);
break;
}
- catch (const ::com::sun::star::uno::Exception &)
+ catch (const uno::Exception &)
{
}
}
@@ -197,7 +206,7 @@ VclBuilder::VclBuilder(Window *pParent, const OUString& sUIDir, const OUString&
handleChild(pParent, reader);
}
- catch (const ::com::sun::star::uno::Exception &rExcept)
+ catch (const uno::Exception &rExcept)
{
SAL_WARN("vcl.layout", "Unable to read .ui file: " << rExcept.Message);
throw;
@@ -805,6 +814,27 @@ namespace
return sTooltipText;
}
+ void setupFromActionName(Button *pButton, VclBuilder::stringmap &rMap, const uno::Reference<frame::XFrame>& rFrame)
+ {
+ if (!rFrame.is())
+ return;
+
+ OUString aCommand(OStringToOUString(extractActionName(rMap), RTL_TEXTENCODING_UTF8));
+ if (aCommand.isEmpty())
+ return;
+
+ uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
+ uno::Reference<frame::XModuleManager2> xModuleManager(frame::ModuleManager::create(xContext));
+ OUString aModuleId(xModuleManager->identify(rFrame));
+
+ OUString aLabel(VclBuilder::getCommandLabel(aCommand, xContext, aModuleId));
+ if (!aLabel.isEmpty())
+ pButton->SetText(aLabel);
+
+ Image aImage(VclBuilder::getCommandImage(aCommand, /* bLarge = */ false, xContext, rFrame, aModuleId));
+ pButton->SetModeImage(aImage);
+ }
+
Button* extractStockAndBuildPushButton(Window *pParent, VclBuilder::stringmap &rMap)
{
WinBits nBits = WB_CLIPCHILDREN|WB_CENTER|WB_VCENTER;
@@ -1275,6 +1305,7 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri
m_pParserState->m_aButtonMenuMaps.push_back(ButtonMenuMap(id, sMenu));
}
pButton->SetImageAlign(IMAGEALIGN_LEFT); //default to left
+ setupFromActionName(pButton, rMap, m_xFrame);
pWindow = pButton;
}
else if (name == "GtkRadioButton")
@@ -2050,6 +2081,98 @@ void VclBuilder::reorderWithinParent(std::vector<Window*>& rChilds, bool bIsButt
}
}
+OUString VclBuilder::getCommandLabel(const OUString& rCommand, const uno::Reference<uno::XComponentContext>& rContext, const OUString& rModuleId)
+{
+ if (rCommand.isEmpty())
+ return OUString();
+
+ try
+ {
+ uno::Reference<container::XNameAccess> xUICommandLabels;
+ uno::Reference<container::XNameAccess> xUICommandDescription(frame::theUICommandDescription::get(rContext));
+
+ if ((xUICommandDescription->getByName(rModuleId) >>= xUICommandLabels) && xUICommandLabels.is())
+ {
+ uno::Sequence<beans::PropertyValue> aProperties;
+ if (xUICommandLabels->getByName(rCommand) >>= aProperties)
+ {
+ for ( sal_Int32 i = 0; i < aProperties.getLength(); i++ )
+ {
+ if (aProperties[i].Name == "Label")
+ {
+ OUString aLabel;
+ if (aProperties[i].Value >>= aLabel)
+ return aLabel;
+ }
+ }
+ }
+ }
+ }
+ catch (uno::Exception&)
+ {
+ }
+
+ return OUString();
+}
+
+Image VclBuilder::getCommandImage(const OUString& rCommand, bool bLarge,
+ const uno::Reference<uno::XComponentContext>& rContext, const uno::Reference<frame::XFrame>& rFrame,
+ const OUString& rModuleId)
+{
+ if (rCommand.isEmpty())
+ return Image();
+
+ sal_Int16 nImageType(ui::ImageType::COLOR_NORMAL | ui::ImageType::SIZE_DEFAULT);
+ if (bLarge)
+ nImageType |= ui::ImageType::SIZE_LARGE;
+
+ try
+ {
+ uno::Reference<frame::XController> xController(rFrame->getController());
+ uno::Reference<frame::XModel> xModel(xController->getModel());
+
+ uno::Reference<ui::XUIConfigurationManagerSupplier> xSupplier(xModel, uno::UNO_QUERY);
+ uno::Reference<ui::XUIConfigurationManager> xDocUICfgMgr(xSupplier->getUIConfigurationManager(), uno::UNO_QUERY);
+ uno::Reference<ui::XImageManager> xDocImgMgr(xDocUICfgMgr->getImageManager(), uno::UNO_QUERY);
+
+ uno::Sequence< uno::Reference<graphic::XGraphic> > aGraphicSeq;
+ uno::Sequence<OUString> aImageCmdSeq(1);
+ aImageCmdSeq[0] = rCommand;
+
+ aGraphicSeq = xDocImgMgr->getImages( nImageType, aImageCmdSeq );
+ uno::Reference<graphic::XGraphic> xGraphic = aGraphicSeq[0];
+ Image aImage(xGraphic);
+
+ if (!!aImage)
+ return aImage;
+ }
+ catch (uno::Exception&)
+ {
+ }
+
+ try {
+ uno::Reference<ui::XModuleUIConfigurationManagerSupplier> xModuleCfgMgrSupplier(ui::theModuleUIConfigurationManagerSupplier::get(rContext));
+ uno::Reference<ui::XUIConfigurationManager> xUICfgMgr(xModuleCfgMgrSupplier->getUIConfigurationManager(rModuleId));
+
+ uno::Sequence< uno::Reference<graphic::XGraphic> > aGraphicSeq;
+ uno::Reference<ui::XImageManager> xModuleImageManager(xUICfgMgr->getImageManager(), uno::UNO_QUERY);
+
+ uno::Sequence<OUString> aImageCmdSeq(1);
+ aImageCmdSeq[0] = rCommand;
+
+ aGraphicSeq = xModuleImageManager->getImages(nImageType, aImageCmdSeq);
+
+ uno::Reference<graphic::XGraphic> xGraphic(aGraphicSeq[0]);
+
+ return Image(xGraphic);
+ }
+ catch (uno::Exception&)
+ {
+ }
+
+ return Image();
+}
+
void VclBuilder::collectPangoAttribute(xmlreader::XmlReader &reader, stringmap &rMap)
{
xmlreader::Span span;
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index 043d2d308d56..179d9792b687 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -2470,7 +2470,7 @@ void MenuBar::SetDisplayable( bool bDisplayable )
}
}
-Window* MenuBar::ImplCreate( Window* pParent, Window* pWindow, MenuBar* pMenu )
+Window* MenuBar::ImplCreate(Window* pParent, Window* pWindow, MenuBar* pMenu, const css::uno::Reference<css::frame::XFrame> &/*rFrame*/)
{
MenuBarWindow *pMenuBarWindow = dynamic_cast<MenuBarWindow*>(pWindow);
if (!pMenuBarWindow)
diff --git a/vcl/source/window/syswin.cxx b/vcl/source/window/syswin.cxx
index 0a2980bd4794..60c80929355d 100644
--- a/vcl/source/window/syswin.cxx
+++ b/vcl/source/window/syswin.cxx
@@ -879,7 +879,7 @@ OString SystemWindow::GetWindowState( sal_uLong nMask ) const
return ImplWindowStateToStr(aData);
}
-void SystemWindow::SetMenuBar( MenuBar* pMenuBar )
+void SystemWindow::SetMenuBar(MenuBar* pMenuBar, const css::uno::Reference<css::frame::XFrame>& rFrame)
{
if ( mpMenuBar != pMenuBar )
{
@@ -902,7 +902,7 @@ void SystemWindow::SetMenuBar( MenuBar* pMenuBar )
if ( pMenuBar )
{
DBG_ASSERT( !pMenuBar->pWindow, "SystemWindow::SetMenuBar() - MenuBars can only set in one SystemWindow at time" );
- ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetMenuBarWindow( pNewWindow = MenuBar::ImplCreate( mpWindowImpl->mpBorderWindow, pOldWindow, pMenuBar ) );
+ ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetMenuBarWindow(pNewWindow = MenuBar::ImplCreate(mpWindowImpl->mpBorderWindow, pOldWindow, pMenuBar, rFrame));
ImplCallEventListeners( VCLEVENT_WINDOW_MENUBARADDED, (void*) pMenuBar );
}
else
diff --git a/vcl/source/window/toolbox2.cxx b/vcl/source/window/toolbox2.cxx
index 864ec63a879a..0f2731fcef75 100644
--- a/vcl/source/window/toolbox2.cxx
+++ b/vcl/source/window/toolbox2.cxx
@@ -41,17 +41,10 @@
#include <unotools/confignode.hxx>
#include <com/sun/star/frame/ModuleManager.hpp>
-#include <com/sun/star/frame/theUICommandDescription.hpp>
#include <com/sun/star/frame/XController.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/frame/XModuleManager2.hpp>
#include <com/sun/star/lang/IllegalArgumentException.hpp>
-#include <com/sun/star/ui/ImageType.hpp>
-#include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
-#include <com/sun/star/ui/XImageManager.hpp>
-#include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
-#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
-#include <com/sun/star/ui/XUIConfigurationManager.hpp>
using namespace vcl;
using namespace com::sun::star;
@@ -621,108 +614,14 @@ void ToolBox::InsertItem( sal_uInt16 nItemId, const OUString& rText,
ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos ) );
}
-// Get label of the command (like of .uno:Save) from the description service
-static OUString getCommandLabel(const OUString& rCommand, const uno::Reference<uno::XComponentContext>& rContext, const OUString& rModuleId)
-{
- if (rCommand.isEmpty())
- return OUString();
-
- try
- {
- uno::Reference<container::XNameAccess> xUICommandLabels;
- uno::Reference<container::XNameAccess> xUICommandDescription(frame::theUICommandDescription::get(rContext));
-
- if ((xUICommandDescription->getByName(rModuleId) >>= xUICommandLabels) && xUICommandLabels.is())
- {
- uno::Sequence<beans::PropertyValue> aProperties;
- if (xUICommandLabels->getByName(rCommand) >>= aProperties)
- {
- for ( sal_Int32 i = 0; i < aProperties.getLength(); i++ )
- {
- if (aProperties[i].Name == "Label")
- {
- OUString aLabel;
- if (aProperties[i].Value >>= aLabel)
- return aLabel;
- }
- }
- }
- }
- }
- catch (uno::Exception&)
- {
- }
-
- return OUString();
-}
-
-// Get label of the command (like of .uno:Save) from the description service
-static Image getCommandImage(const OUString& rCommand, bool bLarge,
- const uno::Reference<uno::XComponentContext>& rContext, const uno::Reference<frame::XFrame>& rFrame,
- const OUString& rModuleId)
-{
- if (rCommand.isEmpty())
- return Image();
-
- sal_Int16 nImageType(ui::ImageType::COLOR_NORMAL | ui::ImageType::SIZE_DEFAULT);
- if (bLarge)
- nImageType |= ui::ImageType::SIZE_LARGE;
-
- try
- {
- uno::Reference<frame::XController> xController(rFrame->getController());
- uno::Reference<frame::XModel> xModel(xController->getModel());
-
- uno::Reference<ui::XUIConfigurationManagerSupplier> xSupplier(xModel, uno::UNO_QUERY);
- uno::Reference<ui::XUIConfigurationManager> xDocUICfgMgr(xSupplier->getUIConfigurationManager(), uno::UNO_QUERY);
- uno::Reference<ui::XImageManager> xDocImgMgr(xDocUICfgMgr->getImageManager(), uno::UNO_QUERY);
-
- uno::Sequence< uno::Reference<graphic::XGraphic> > aGraphicSeq;
- uno::Sequence<OUString> aImageCmdSeq(1);
- aImageCmdSeq[0] = rCommand;
-
- aGraphicSeq = xDocImgMgr->getImages( nImageType, aImageCmdSeq );
- uno::Reference<graphic::XGraphic> xGraphic = aGraphicSeq[0];
- Image aImage(xGraphic);
-
- if (!!aImage)
- return aImage;
- }
- catch (uno::Exception&)
- {
- }
-
- try {
- uno::Reference<ui::XModuleUIConfigurationManagerSupplier> xModuleCfgMgrSupplier(ui::theModuleUIConfigurationManagerSupplier::get(rContext));
- uno::Reference<ui::XUIConfigurationManager> xUICfgMgr(xModuleCfgMgrSupplier->getUIConfigurationManager(rModuleId));
-
- uno::Sequence< uno::Reference<graphic::XGraphic> > aGraphicSeq;
- uno::Reference<ui::XImageManager> xModuleImageManager(xUICfgMgr->getImageManager(), uno::UNO_QUERY);
-
- uno::Sequence<OUString> aImageCmdSeq(1);
- aImageCmdSeq[0] = rCommand;
-
- aGraphicSeq = xModuleImageManager->getImages(nImageType, aImageCmdSeq);
-
- uno::Reference<graphic::XGraphic> xGraphic(aGraphicSeq[0]);
-
- return Image(xGraphic);
- }
- catch (uno::Exception&)
- {
- }
-
- return Image();
-}
-
void ToolBox::InsertItem(const OUString& rCommand, const uno::Reference<frame::XFrame>& rFrame, ToolBoxItemBits nBits, const Size& rRequestedSize, sal_uInt16 nPos)
{
uno::Reference<uno::XComponentContext> xContext(comphelper::getProcessComponentContext());
uno::Reference<frame::XModuleManager2> xModuleManager(frame::ModuleManager::create(xContext));
OUString aModuleId(xModuleManager->identify(rFrame));
- OUString aLabel(getCommandLabel(rCommand, xContext, aModuleId));
- Image aImage(getCommandImage(rCommand, (GetToolboxButtonSize() == TOOLBOX_BUTTONSIZE_LARGE), xContext, rFrame, aModuleId));
+ OUString aLabel(VclBuilder::getCommandLabel(rCommand, xContext, aModuleId));
+ Image aImage(VclBuilder::getCommandImage(rCommand, (GetToolboxButtonSize() == TOOLBOX_BUTTONSIZE_LARGE), xContext, rFrame, aModuleId));
// let's invent an ItemId
const sal_uInt16 COMMAND_ITEMID_START = 30000;