diff options
-rw-r--r-- | include/sfx2/classificationhelper.hxx | 2 | ||||
-rw-r--r-- | include/sfx2/infobar.hxx | 38 | ||||
-rw-r--r-- | include/sfx2/sfxbasecontroller.hxx | 13 | ||||
-rw-r--r-- | include/sfx2/viewfrm.hxx | 13 | ||||
-rw-r--r-- | offapi/UnoApi_offapi.mk | 2 | ||||
-rw-r--r-- | offapi/com/sun/star/frame/InfobarType.idl | 38 | ||||
-rw-r--r-- | offapi/com/sun/star/frame/XInfobarProvider.idl | 104 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh4.cxx | 2 | ||||
-rw-r--r-- | sfx2/source/dialog/infobar.cxx | 98 | ||||
-rw-r--r-- | sfx2/source/doc/objserv.cxx | 18 | ||||
-rw-r--r-- | sfx2/source/view/classificationhelper.cxx | 22 | ||||
-rw-r--r-- | sfx2/source/view/sfxbasecontroller.cxx | 64 | ||||
-rwxr-xr-x | sfx2/source/view/viewfrm.cxx | 23 |
13 files changed, 347 insertions, 90 deletions
diff --git a/include/sfx2/classificationhelper.hxx b/include/sfx2/classificationhelper.hxx index 3f8c2d0b997c..810f6935d6f6 100644 --- a/include/sfx2/classificationhelper.hxx +++ b/include/sfx2/classificationhelper.hxx @@ -73,7 +73,7 @@ public: OUString GetHigherClass(const OUString& first, const OUString& second); /// If GetImpactScale() and GetImpactLevel*() will return something meaningful. bool HasImpactLevel(); - InfoBarType GetImpactLevelType(); + InfobarType GetImpactLevelType(); /// Larger value means more confidential. sal_Int32 GetImpactLevel(); /// Comparing the GetImpactLevel() result is only meaningful when the impact scale is the same. diff --git a/include/sfx2/infobar.hxx b/include/sfx2/infobar.hxx index caf8b5b82518..d1b0254f42f3 100644 --- a/include/sfx2/infobar.hxx +++ b/include/sfx2/infobar.hxx @@ -18,11 +18,12 @@ #include <sfx2/dllapi.h> #include <sfx2/childwin.hxx> -enum class InfoBarType { - Info, - Success, - Warning, - Danger +// These must match the values in offapi/com/sun/star/frame/InfobarType.idl +enum class InfobarType { + INFO = 0, + SUCCESS = 1, + WARNING = 2, + DANGER = 3 }; /** SfxChildWindow for positioning the InfoBar in the view. @@ -50,27 +51,30 @@ class SFX2_DLLPUBLIC SfxInfoBarWindow : public vcl::Window { private: OUString const m_sId; - InfoBarType m_eType; + InfobarType m_eType; VclPtr<FixedImage> m_pImage; - VclPtr<FixedText> m_pMessage; + VclPtr<FixedText> m_pPrimaryMessage; + VclPtr<FixedText> m_pSecondaryMessage; VclPtr<Button> m_pCloseBtn; std::vector< VclPtr<PushButton> > m_aActionBtns; - void SetForeAndBackgroundColors( InfoBarType eType ); + void SetForeAndBackgroundColors( InfobarType eType ); public: SfxInfoBarWindow( vcl::Window* parent, const OUString& sId, - const OUString& sMessage, - InfoBarType infoBarType, - WinBits nMessageStyle); + const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, + InfobarType InfobarType, + bool bShowCloseButton, WinBits nMessageStyle); virtual ~SfxInfoBarWindow( ) override; virtual void dispose() override; const OUString& getId() const { return m_sId; } virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& ) override; virtual void Resize( ) override; - void Update( const OUString& sNewMessage, InfoBarType eType ); - basegfx::BColor m_aBackgroundColor; + void Update(const OUString& sPrimaryMessage, const OUString& sSecondaryMessage, + InfobarType eType); + basegfx::BColor m_aBackgroundColor; basegfx::BColor m_aForegroundColor; /** Add button to Infobar. @@ -95,9 +99,11 @@ class SfxInfoBarContainerWindow : public vcl::Window virtual void dispose() override; VclPtr<SfxInfoBarWindow> appendInfoBar(const OUString& sId, - const OUString& sMessage, - InfoBarType ibType, - WinBits nMessageStyle); + const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, + InfobarType ibType, + WinBits nMessageStyle, + bool bShowCloseButton); VclPtr<SfxInfoBarWindow> getInfoBar(const OUString& sId); bool hasInfoBarWithID(const OUString& sId); void removeInfoBar(VclPtr<SfxInfoBarWindow> const & pInfoBar); diff --git a/include/sfx2/sfxbasecontroller.hxx b/include/sfx2/sfxbasecontroller.hxx index e15d53e4ab53..a49a08260e20 100644 --- a/include/sfx2/sfxbasecontroller.hxx +++ b/include/sfx2/sfxbasecontroller.hxx @@ -28,6 +28,7 @@ #include <com/sun/star/frame/XDispatchInformationProvider.hpp> #include <com/sun/star/frame/XController2.hpp> #include <com/sun/star/frame/XControllerBorder.hpp> +#include <com/sun/star/frame/XInfobarProvider.hpp> #include <com/sun/star/frame/XTitle.hpp> #include <com/sun/star/frame/XTitleChangeBroadcaster.hpp> #include <com/sun/star/lang/XInitialization.hpp> @@ -70,6 +71,7 @@ typedef ::cppu::WeakImplHelper < css::frame::XController2 , css::ui::XContextMenuInterception , css::awt::XUserInputInterception , css::frame::XDispatchInformationProvider + , css::frame::XInfobarProvider , css::frame::XTitle , css::frame::XTitleChangeBroadcaster , css::lang::XInitialization @@ -175,6 +177,17 @@ public: // css::lang::XInitialization virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override; + // XInfobarProvider + virtual void SAL_CALL + appendInfobar(const OUString& sId, const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, sal_Int32 aInfobarType, + const css::uno::Sequence<css::beans::StringPair>& actionButtons, + sal_Bool bShowCloseButton) override; + virtual void SAL_CALL updateInfobar(const OUString& sId, const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, + sal_Int32 aInfobarType) override; + virtual void SAL_CALL removeInfobar(const OUString& sId) override; + // FIXME: TL needs this in sw/source/ui/uno/unotxdoc.cxx now; // either the _Impl name should vanish or there should be an "official" API SfxViewShell* GetViewShell_Impl() const; diff --git a/include/sfx2/viewfrm.hxx b/include/sfx2/viewfrm.hxx index 502f1fe4480d..f7e9f333ac56 100644 --- a/include/sfx2/viewfrm.hxx +++ b/include/sfx2/viewfrm.hxx @@ -39,7 +39,7 @@ class Point; class Size; class SfxChildWindow; class SfxInfoBarWindow; -enum class InfoBarType; +enum class InfobarType; class SFX2_DLLPUBLIC SfxViewFrame: public SfxShell, public SfxListener { @@ -153,11 +153,14 @@ public: and position of each button will be changed: only the width will remain unchanged. */ VclPtr<SfxInfoBarWindow> AppendInfoBar(const OUString& sId, - const OUString& sMessage, - InfoBarType aInfoBarType); + const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, + InfobarType aInfobarType, + bool bShowCloseButton=true); void RemoveInfoBar(const OUString& sId); - void UpdateInfoBar(const OUString& sId, - const OUString& sMessage, InfoBarType eType); + void UpdateInfoBar(const OUString& sId, const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, + InfobarType eType); bool HasInfoBarWithID(const OUString& sId); SAL_DLLPRIVATE void GetDocNumber_Impl(); diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk index c86e7d5a7800..6ab05f38b4d5 100644 --- a/offapi/UnoApi_offapi.mk +++ b/offapi/UnoApi_offapi.mk @@ -2580,6 +2580,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/frame,\ FrameActionEvent \ FrameSearchFlag \ IllegalArgumentIOException \ + InfobarType \ LayoutManagerEvents \ TerminationVetoException \ TitleChangedEvent \ @@ -2620,6 +2621,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/frame,\ XFrames \ XFramesSupplier \ XGlobalEventBroadcaster \ + XInfobarProvider \ XInterceptorInfo \ XLayoutManager \ XLayoutManager2 \ diff --git a/offapi/com/sun/star/frame/InfobarType.idl b/offapi/com/sun/star/frame/InfobarType.idl new file mode 100644 index 000000000000..6c410d654b2a --- /dev/null +++ b/offapi/com/sun/star/frame/InfobarType.idl @@ -0,0 +1,38 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef __com_sun_star_frame_InfobarType_idl__ +#define __com_sun_star_frame_InfobarType_idl__ + +module com { module sun { module star { module frame { + +/** Infobar types. + + @since LibreOffice 6.5 +*/ +constants InfobarType +{ + /** For information messages (color: light blue). */ + const long INFO = 0; + + /** For success notifications (color: light green). */ + const long SUCCESS = 1; + + /** For warning messages (color: orange). */ + const long WARNING = 2; + + /** For critical errors (color: red). */ + const long DANGER = 3; +}; + +}; }; }; }; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
\ No newline at end of file diff --git a/offapi/com/sun/star/frame/XInfobarProvider.idl b/offapi/com/sun/star/frame/XInfobarProvider.idl new file mode 100644 index 000000000000..68278c50ab4e --- /dev/null +++ b/offapi/com/sun/star/frame/XInfobarProvider.idl @@ -0,0 +1,104 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef __com_sun_star_frame_XInfobarProvider_idl__ +#define __com_sun_star_frame_XInfobarProvider_idl__ + +#include <com/sun/star/beans/StringPair.idl> +#include <com/sun/star/frame/InfobarType.idl> +#include <com/sun/star/uno/XInterface.idl> + +module com { module sun { module star { module frame { + +/** Allows to add Infobars to a frame. + + This interface can be obtained via com::sun::star::frame::XController. + + @since LibreOffice 6.5 + */ +interface XInfobarProvider: uno::XInterface +{ + /** Creates and displays a new Infobar. + + @param id + The ID by which this Infobar is recognized. + You can remove the Infobar afterwards using this ID. + + @param primaryMessage + The (short) primary message. + Will appear at the start of the infobar in bold letters. + May be empty. + + @param secondaryMessage + The (longer) secondary message. + Will appear in normal letters after the primaryMessage + + @param infobarType + The type of the Infobar. + See com::sun::star::frame::InfobarType for possible values. + + @param actionButtons + A sequence of action buttons. + The buttons will be added from Right to Left at the right side of the info bar. + Each button is represented by a com::sun::star::beans::StringPair. + StringPair::First represents the button label, while + StringPair::Second represents the button URL which will be called on button click. + The URL can be any URL, either external (http://libreoffice.org), or internal (.uno:Save), + or from your extension (service:your.example.Extension?anyAction). + + @param showCloseButton + Whether the Close (x) button is shown at the end of the Infobar. + Set to false, when you don't want the user to close the Infobar. + + @throws com::sun::star::lang::IllegalArgumentException + If an Infobar with the same ID already exists, or infobarType contains an invalid value. + */ + void appendInfobar( + [in] string id, + [in] string primaryMessage, + [in] string secondaryMessage, + [in] long infobarType, + [in] sequence<com::sun::star::beans::StringPair> actionButtons, + [in] boolean showCloseButton) + raises(com::sun::star::lang::IllegalArgumentException); + + /** Updates an existing Infobar. + Use if you want to update only small parts of the Infobar. + + @see appendInfobar for parameter documentation. + + @throws com::sun::star::container::NoSuchElementException + If no such Infobar exists (it might have been closed by the user already) + @throws com::sun::star::lang::IllegalArgumentException + If infobarType contains an invalid value. + */ + void updateInfobar( + [in] string id, + [in] string primaryMessage, + [in] string secondaryMessage, + [in] long infobarType) + raises(com::sun::star::container::NoSuchElementException); + + /** Removes an existing Infobar. + + @param id + The ID which was used when creating this Infobar. + + @throws com::sun::star::container::NoSuchElementException + If no such Infobar exists (it might have been closed by the user already) + */ + void removeInfobar([in] string id) raises(com::sun::star::container::NoSuchElementException); +}; + + +}; }; }; }; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
\ No newline at end of file diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx index 59fccc38a90a..bd8e79de7516 100644 --- a/sc/source/ui/docshell/docsh4.cxx +++ b/sc/source/ui/docshell/docsh4.cxx @@ -490,7 +490,7 @@ void ScDocShell::Execute( SfxRequest& rReq ) if (pViewFrame) { pViewFrame->RemoveInfoBar("enablecontent"); - auto pInfoBar = pViewFrame->AppendInfoBar("enablecontent", ScResId(STR_RELOAD_TABLES), InfoBarType::Warning); + auto pInfoBar = pViewFrame->AppendInfoBar("enablecontent", "", ScResId(STR_RELOAD_TABLES), InfobarType::WARNING); if (pInfoBar) { VclPtrInstance<PushButton> xBtn(&pViewFrame->GetWindow()); diff --git a/sfx2/source/dialog/infobar.cxx b/sfx2/source/dialog/infobar.cxx index 84ab3d85f8d0..a1c9ef21cbee 100644 --- a/sfx2/source/dialog/infobar.cxx +++ b/sfx2/source/dialog/infobar.cxx @@ -30,35 +30,36 @@ using namespace drawinglayer::processor2d; using namespace drawinglayer::primitive2d; using namespace drawinglayer::attribute; using namespace basegfx; +using namespace css::frame; namespace { const long INFO_BAR_BASE_HEIGHT = 40; -void GetInfoBarColors(InfoBarType ibType, BColor& rBackgroundColor, BColor& rForegroundColor, BColor& rMessageColor) +void GetInfoBarColors(InfobarType ibType, BColor& rBackgroundColor, BColor& rForegroundColor, BColor& rMessageColor) { rMessageColor = basegfx::BColor(0.0, 0.0, 0.0); switch (ibType) { - case InfoBarType::Info: // blue; #004785/0,71,133; #BDE5F8/189,229,248 + case InfobarType::INFO: // blue; #004785/0,71,133; #BDE5F8/189,229,248 rBackgroundColor = basegfx::BColor(0.741, 0.898, 0.973); rForegroundColor = basegfx::BColor(0.0, 0.278, 0.522); break; - case InfoBarType::Success: // green; #32550C/50,85,12; #DFF2BF/223,242,191 + case InfobarType::SUCCESS: // green; #32550C/50,85,12; #DFF2BF/223,242,191 rBackgroundColor = basegfx::BColor(0.874,0.949,0.749); rForegroundColor = basegfx::BColor(0.196,0.333,0.047); break; - case InfoBarType::Warning: // orange; #704300/112,67,0; #FEEFB3/254,239,179 + case InfobarType::WARNING: // orange; #704300/112,67,0; #FEEFB3/254,239,179 rBackgroundColor = basegfx::BColor(0.996,0.937,0.702); rForegroundColor = basegfx::BColor(0.439,0.263,0.0); break; - case InfoBarType::Danger: // red; #7A0006/122,0,6; #FFBABA/255,186,186 + case InfobarType::DANGER: // red; #7A0006/122,0,6; #FFBABA/255,186,186 rBackgroundColor = basegfx::BColor(1.0,0.729,0.729); rForegroundColor = basegfx::BColor(0.478,0.0,0.024); break; - }//switch + } //remove this? const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings(); @@ -69,26 +70,26 @@ void GetInfoBarColors(InfoBarType ibType, BColor& rBackgroundColor, BColor& rFo } } -OUString GetInfoBarIconName(InfoBarType ibType) +OUString GetInfoBarIconName(InfobarType ibType) { OUString aRet; switch (ibType) { - case InfoBarType::Info: + case InfobarType::INFO: aRet = "vcl/res/infobox.svg"; break; - case InfoBarType::Success: + case InfobarType::SUCCESS: aRet = "vcl/res/successbox.svg"; break; - case InfoBarType::Warning: + case InfobarType::WARNING: aRet = "vcl/res/warningbox.svg"; break; - case InfoBarType::Danger: + case InfobarType::DANGER: aRet = "vcl/res/errorbox.svg"; break; - }//switch + } return aRet; } @@ -102,7 +103,7 @@ public: explicit SfxCloseButton(vcl::Window* pParent) : PushButton(pParent, 0) { basegfx::BColor aMessageColor; - GetInfoBarColors(InfoBarType::Warning,m_aBackgroundColor,m_aForegroundColor,aMessageColor); + GetInfoBarColors(InfobarType::WARNING, m_aBackgroundColor, m_aForegroundColor, aMessageColor); } virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) override; @@ -169,14 +170,17 @@ void SfxCloseButton::setForegroundColor(const basegfx::BColor& rColor) } // anonymous namespace SfxInfoBarWindow::SfxInfoBarWindow(vcl::Window* pParent, const OUString& sId, - const OUString& sMessage, - InfoBarType ibType, + const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, + InfobarType ibType, + bool bShowCloseButton, WinBits nMessageStyle = WB_LEFT|WB_VCENTER) : Window(pParent, 0), m_sId(sId), m_eType(ibType), m_pImage(VclPtr<FixedImage>::Create(this, nMessageStyle)), - m_pMessage(VclPtr<FixedText>::Create(this, nMessageStyle | WB_WORDBREAK)), + m_pPrimaryMessage(VclPtr<FixedText>::Create(this, nMessageStyle | WB_WORDBREAK)), + m_pSecondaryMessage(VclPtr<FixedText>::Create(this, nMessageStyle | WB_WORDBREAK)), m_pCloseBtn(VclPtr<SfxCloseButton>::Create(this)), m_aActionBtns() { @@ -189,11 +193,23 @@ SfxInfoBarWindow::SfxInfoBarWindow(vcl::Window* pParent, const OUString& sId, m_pImage->SetPaintTransparent(true); m_pImage->Show(); - m_pMessage->SetText(sMessage); - m_pMessage->Show(); + vcl::Font aFont(m_pPrimaryMessage->GetControlFont()); + aFont.SetWeight(WEIGHT_BOLD); + m_pPrimaryMessage->SetControlFont(aFont); + if (!sPrimaryMessage.isEmpty()) + { + m_pPrimaryMessage->SetText(sPrimaryMessage); + m_pPrimaryMessage->Show(); + } + + m_pSecondaryMessage->SetText(sSecondaryMessage); + m_pSecondaryMessage->Show(); - m_pCloseBtn->SetClickHdl(LINK(this, SfxInfoBarWindow, CloseHandler)); - m_pCloseBtn->Show(); + if (bShowCloseButton) + { + m_pCloseBtn->SetClickHdl(LINK(this, SfxInfoBarWindow, CloseHandler)); + m_pCloseBtn->Show(); + } EnableChildTransparentMode(); @@ -212,14 +228,15 @@ SfxInfoBarWindow::~SfxInfoBarWindow() disposeOnce(); } -void SfxInfoBarWindow::SetForeAndBackgroundColors(InfoBarType eType) +void SfxInfoBarWindow::SetForeAndBackgroundColors(InfobarType eType) { basegfx::BColor aMessageColor; GetInfoBarColors(eType,m_aBackgroundColor,m_aForegroundColor,aMessageColor); static_cast<SfxCloseButton*>(m_pCloseBtn.get())->setBackgroundColor(m_aBackgroundColor); static_cast<SfxCloseButton*>(m_pCloseBtn.get())->setForegroundColor(m_aForegroundColor); - m_pMessage->SetControlForeground(Color(aMessageColor)); + m_pPrimaryMessage->SetControlForeground(Color(aMessageColor)); + m_pSecondaryMessage->SetControlForeground(Color(aMessageColor)); } void SfxInfoBarWindow::dispose() @@ -228,7 +245,8 @@ void SfxInfoBarWindow::dispose() rxBtn.disposeAndClear(); m_pImage.disposeAndClear(); - m_pMessage.disposeAndClear(); + m_pPrimaryMessage.disposeAndClear(); + m_pSecondaryMessage.disposeAndClear(); m_pCloseBtn.disposeAndClear(); m_aActionBtns.clear( ); vcl::Window::dispose(); @@ -292,12 +310,19 @@ void SfxInfoBarWindow::Resize() nX -= nButtonGap; } - Point aMessagePosition(32 * fScaleFactor + 10 * fScaleFactor, 10 * fScaleFactor); + Point aPrimaryMessagePosition(32 * fScaleFactor + 10 * fScaleFactor, 10 * fScaleFactor); + Point aSecondaryMessagePosition(aPrimaryMessagePosition); Size aMessageSize(nX - 35 * fScaleFactor, 20 * fScaleFactor); - Size aActualSize = m_pMessage->CalcMinimumSize(aMessageSize.getWidth()); - long aMinimumHeight = m_pMessage->CalcMinimumSize().getHeight(); + Size aPrimaryTextSize = m_pPrimaryMessage->CalcMinimumSize(aMessageSize.getWidth()); + Size aSecondaryTextSize = m_pSecondaryMessage->CalcMinimumSize(aMessageSize.getWidth() + - aPrimaryTextSize.getWidth()); + if (!m_pPrimaryMessage->GetText().isEmpty()) + aSecondaryMessagePosition.AdjustX(aPrimaryTextSize.getWidth() + 6 * fScaleFactor); + + long aMinimumHeight = std::max(m_pPrimaryMessage->CalcMinimumSize().getHeight(), + m_pSecondaryMessage->CalcMinimumSize().getHeight()); - long aExtraHeight = aActualSize.getHeight() - aMinimumHeight; + long aExtraHeight = aSecondaryTextSize.getHeight() - aMinimumHeight; // The message won't be legible and the window will get too high if (aMessageSize.getWidth() < 30) @@ -305,13 +330,14 @@ void SfxInfoBarWindow::Resize() aExtraHeight = 0; } - m_pMessage->SetPosSizePixel(aMessagePosition, aActualSize); + m_pPrimaryMessage->SetPosSizePixel(aPrimaryMessagePosition, aPrimaryTextSize); + m_pSecondaryMessage->SetPosSizePixel(aSecondaryMessagePosition, aSecondaryTextSize); m_pImage->SetPosSizePixel(Point(4, 4), Size(32 * fScaleFactor, 32 * fScaleFactor)); SetPosSizePixel(Point(0, 0), Size(nWidth, INFO_BAR_BASE_HEIGHT * fScaleFactor + aExtraHeight * fScaleFactor)); } -void SfxInfoBarWindow::Update( const OUString &sNewMessage, InfoBarType eType ) +void SfxInfoBarWindow::Update( const OUString& sPrimaryMessage, const OUString& sSecondaryMessage, InfobarType eType ) { if (m_eType != eType) { @@ -320,7 +346,8 @@ void SfxInfoBarWindow::Update( const OUString &sNewMessage, InfoBarType eType ) m_pImage->SetImage(Image(StockImage::Yes, GetInfoBarIconName(eType))); } - m_pMessage->SetText( sNewMessage ); + m_pPrimaryMessage->SetText( sPrimaryMessage ); + m_pSecondaryMessage->SetText( sSecondaryMessage ); Resize(); Invalidate(); } @@ -350,14 +377,15 @@ void SfxInfoBarContainerWindow::dispose() Window::dispose(); } -VclPtr<SfxInfoBarWindow> SfxInfoBarContainerWindow::appendInfoBar(const OUString& sId, - const OUString& sMessage, - InfoBarType ibType, - WinBits nMessageStyle) +VclPtr<SfxInfoBarWindow> +SfxInfoBarContainerWindow::appendInfoBar(const OUString& sId, const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, InfobarType ibType, + WinBits nMessageStyle, bool bShowCloseButton) { Size aSize = GetSizePixel(); - auto pInfoBar = VclPtr<SfxInfoBarWindow>::Create(this, sId, sMessage, ibType, nMessageStyle); + auto pInfoBar = VclPtr<SfxInfoBarWindow>::Create(this, sId, sPrimaryMessage, sSecondaryMessage, + ibType, nMessageStyle, bShowCloseButton); basegfx::BColor aBackgroundColor; basegfx::BColor aForegroundColor; diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx index f586fe446b5d..f4b54c94b72e 100644 --- a/sfx2/source/doc/objserv.cxx +++ b/sfx2/source/doc/objserv.cxx @@ -1277,35 +1277,35 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) if ( pFrame ) { SignatureState eState = GetDocumentSignatureState(); - InfoBarType aInfoBarType(InfoBarType::Info); + InfobarType aInfobarType(InfobarType::INFO); OUString sMessage(""); switch (eState) { case SignatureState::BROKEN: sMessage = SfxResId(STR_SIGNATURE_BROKEN); - aInfoBarType = InfoBarType::Danger; + aInfobarType = InfobarType::DANGER; break; case SignatureState::INVALID: sMessage = SfxResId(STR_SIGNATURE_INVALID); // Warning only, I've tried Danger and it looked too scary - aInfoBarType = InfoBarType::Warning; + aInfobarType = InfobarType::WARNING; break; case SignatureState::NOTVALIDATED: sMessage = SfxResId(STR_SIGNATURE_NOTVALIDATED); - aInfoBarType = InfoBarType::Warning; + aInfobarType = InfobarType::WARNING; break; case SignatureState::PARTIAL_OK: sMessage = SfxResId(STR_SIGNATURE_PARTIAL_OK); - aInfoBarType = InfoBarType::Warning; + aInfobarType = InfobarType::WARNING; break; case SignatureState::OK: sMessage = SfxResId(STR_SIGNATURE_OK); - aInfoBarType = InfoBarType::Info; + aInfobarType = InfobarType::INFO; break; case SignatureState::NOTVALIDATED_PARTIAL_OK: sMessage = SfxResId(STR_SIGNATURE_NOTVALIDATED_PARTIAL_OK); - aInfoBarType = InfoBarType::Warning; + aInfobarType = InfobarType::WARNING; break; //FIXME SignatureState::Unknown, own message? default: @@ -1317,7 +1317,7 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) { if ( !sMessage.isEmpty() ) { - auto pInfoBar = pFrame->AppendInfoBar("signature", sMessage, aInfoBarType); + auto pInfoBar = pFrame->AppendInfoBar("signature", "", sMessage, aInfobarType); if (pInfoBar == nullptr || pInfoBar->IsDisposed()) return; VclPtrInstance<PushButton> xBtn(&(pFrame->GetWindow())); @@ -1332,7 +1332,7 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) if ( eState == SignatureState::NOSIGNATURES ) pFrame->RemoveInfoBar("signature"); else - pFrame->UpdateInfoBar("signature", sMessage, aInfoBarType); + pFrame->UpdateInfoBar("signature", "", sMessage, aInfobarType); } } diff --git a/sfx2/source/view/classificationhelper.cxx b/sfx2/source/view/classificationhelper.cxx index 492f5819f5d8..e2a06a07719e 100644 --- a/sfx2/source/view/classificationhelper.cxx +++ b/sfx2/source/view/classificationhelper.cxx @@ -693,11 +693,11 @@ bool SfxClassificationHelper::HasDocumentFooter() return it != rCategory.m_aLabels.end() && !it->second.isEmpty(); } -InfoBarType SfxClassificationHelper::GetImpactLevelType() +InfobarType SfxClassificationHelper::GetImpactLevelType() { - InfoBarType aRet; + InfobarType aRet; - aRet = InfoBarType::Warning; + aRet = InfobarType::WARNING; auto itCategory = m_pImpl->m_aCategory.find(SfxClassificationPolicyType::IntellectualProperty); if (itCategory == m_pImpl->m_aCategory.end()) @@ -718,22 +718,22 @@ InfoBarType SfxClassificationHelper::GetImpactLevelType() if (aScale == "UK-Cabinet") { if (aLevel == "0") - aRet = InfoBarType::Success; + aRet = InfobarType::SUCCESS; else if (aLevel == "1") - aRet = InfoBarType::Warning; + aRet = InfobarType::WARNING; else if (aLevel == "2") - aRet = InfoBarType::Warning; + aRet = InfobarType::WARNING; else if (aLevel == "3") - aRet = InfoBarType::Danger; + aRet = InfobarType::DANGER; } else if (aScale == "FIPS-199") { if (aLevel == "Low") - aRet = InfoBarType::Success; + aRet = InfobarType::SUCCESS; else if (aLevel == "Moderate") - aRet = InfoBarType::Warning; + aRet = InfobarType::WARNING; else if (aLevel == "High") - aRet = InfoBarType::Danger; + aRet = InfobarType::DANGER; } return aRet; } @@ -890,7 +890,7 @@ void SfxClassificationHelper::UpdateInfobar(SfxViewFrame& rViewFrame) aMessage = aMessage.replaceFirst("%1", aBACName); rViewFrame.RemoveInfoBar("classification"); - rViewFrame.AppendInfoBar("classification", aMessage, GetImpactLevelType()); + rViewFrame.AppendInfoBar("classification", "", aMessage, GetImpactLevelType()); } } diff --git a/sfx2/source/view/sfxbasecontroller.cxx b/sfx2/source/view/sfxbasecontroller.cxx index d143685d7c4b..3898c843b97a 100644 --- a/sfx2/source/view/sfxbasecontroller.cxx +++ b/sfx2/source/view/sfxbasecontroller.cxx @@ -99,6 +99,7 @@ using ::com::sun::star::frame::XDispatchProvider; using ::com::sun::star::document::XViewDataSupplier; using ::com::sun::star::container::XIndexAccess; using ::com::sun::star::beans::PropertyValue; +using ::com::sun::star::beans::StringPair; using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::Exception; @@ -1398,7 +1399,8 @@ void SfxBaseController::ShowInfoBars( ) // Get the Frame and show the InfoBar if not checked out SfxViewFrame* pViewFrame = m_pData->m_pViewShell->GetFrame(); - auto pInfoBar = pViewFrame->AppendInfoBar( "checkout", SfxResId( STR_NONCHECKEDOUT_DOCUMENT ), InfoBarType::Warning); + auto pInfoBar = pViewFrame->AppendInfoBar("checkout", "", SfxResId(STR_NONCHECKEDOUT_DOCUMENT), + InfobarType::WARNING); if (pInfoBar) { VclPtrInstance<PushButton> xBtn(&pViewFrame->GetWindow()); @@ -1472,4 +1474,64 @@ void SfxBaseController::initialize( const css::uno::Sequence< css::uno::Any >& / { } +void SAL_CALL SfxBaseController::appendInfobar(const OUString& sId, const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, + sal_Int32 aInfobarType, + const Sequence<StringPair>& actionButtons, + sal_Bool bShowCloseButton) +{ + if (aInfobarType < static_cast<sal_Int32>(InfobarType::INFO) + || aInfobarType > static_cast<sal_Int32>(InfobarType::DANGER)) + throw lang::IllegalArgumentException("Undefined InfobarType: " + + OUString::number(aInfobarType), + static_cast<::cppu::OWeakObject*>(this), 0); + SfxViewFrame* pViewFrame = m_pData->m_pViewShell->GetFrame(); + if (pViewFrame->HasInfoBarWithID(sId)) + throw lang::IllegalArgumentException("Infobar with ID '" + sId + "' already existing.", + static_cast<::cppu::OWeakObject*>(this), 0); + + auto pInfoBar + = pViewFrame->AppendInfoBar(sId, sPrimaryMessage, sSecondaryMessage, + static_cast<InfobarType>(aInfobarType), bShowCloseButton); + if (!pInfoBar) + throw uno::RuntimeException("Could not create Infobar"); + + auto vActionButtons = comphelper::sequenceToContainer<std::vector<StringPair>>(actionButtons); + for (auto& actionButton : vActionButtons) + { + if (actionButton.First.isEmpty() || actionButton.Second.isEmpty()) + continue; + VclPtrInstance<PushButton> xBtn(&pViewFrame->GetWindow()); + xBtn->SetText(actionButton.First); + xBtn->SetSizePixel(xBtn->GetOptimalSize()); + xBtn->SetCommandHandler(actionButton.Second); + pInfoBar->addButton(xBtn); + } +} + +void SAL_CALL SfxBaseController::updateInfobar(const OUString& sId, const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, + sal_Int32 aInfobarType) +{ + if (aInfobarType < static_cast<sal_Int32>(InfobarType::INFO) + || aInfobarType > static_cast<sal_Int32>(InfobarType::DANGER)) + throw lang::IllegalArgumentException("Undefined InfobarType: " + + OUString::number(aInfobarType), + static_cast<::cppu::OWeakObject*>(this), 0); + SfxViewFrame* pViewFrame = m_pData->m_pViewShell->GetFrame(); + if (!pViewFrame->HasInfoBarWithID(sId)) + throw css::container::NoSuchElementException("Infobar with ID '" + sId + "' not found."); + + pViewFrame->UpdateInfoBar(sId, sPrimaryMessage, sSecondaryMessage, + static_cast<InfobarType>(aInfobarType)); +} + +void SAL_CALL SfxBaseController::removeInfobar(const OUString& sId) +{ + SfxViewFrame* pViewFrame = m_pData->m_pViewShell->GetFrame(); + if (!pViewFrame->HasInfoBarWithID(sId)) + throw css::container::NoSuchElementException("Infobar with ID '" + sId + "' not found."); + pViewFrame->RemoveInfoBar(sId); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/source/view/viewfrm.cxx b/sfx2/source/view/viewfrm.cxx index 4fa88c354f99..1ff5b5b04adf 100755 --- a/sfx2/source/view/viewfrm.cxx +++ b/sfx2/source/view/viewfrm.cxx @@ -1245,7 +1245,7 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) sal_Int32 iLast = sLastVersion.getToken(0,'.').toInt32() * 10 + sLastVersion.getToken(1,'.').toInt32(); if ((iCurrent > iLast) && !Application::IsHeadlessModeEnabled() && !bIsUITest) { - VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("whatsnew", SfxResId(STR_WHATSNEW_TEXT), InfoBarType::Info); + VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("whatsnew", "", SfxResId(STR_WHATSNEW_TEXT), InfobarType::INFO); VclPtrInstance<PushButton> xWhatsNewButton(&GetWindow()); xWhatsNewButton->SetText(SfxResId(STR_WHATSNEW_BUTTON)); xWhatsNewButton->SetSizePixel(xWhatsNewButton->GetOptimalSize()); @@ -1284,7 +1284,7 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) { bUpdateLastTimeGetInvolvedShown = true; - VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("getinvolved", SfxResId(STR_GET_INVOLVED_TEXT), InfoBarType::Info); + VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("getinvolved", "", SfxResId(STR_GET_INVOLVED_TEXT), InfobarType::INFO); VclPtrInstance<PushButton> xGetInvolvedButton(&GetWindow()); xGetInvolvedButton->SetText(SfxResId(STR_GET_INVOLVED_BUTTON)); @@ -1311,7 +1311,7 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) { bUpdateLastTimeDonateShown = true; - VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("donate", SfxResId(STR_DONATE_TEXT), InfoBarType::Info); + VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("donate", "", SfxResId(STR_DONATE_TEXT), InfobarType::INFO); VclPtrInstance<PushButton> xDonateButton(&GetWindow()); xDonateButton->SetText(SfxResId(STR_DONATE_BUTTON)); @@ -1338,7 +1338,7 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) { bool bSignPDF = IsSignPDF(m_xObjSh); - auto pInfoBar = AppendInfoBar("readonly", SfxResId(bSignPDF ? STR_READONLY_PDF : STR_READONLY_DOCUMENT), InfoBarType::Info); + auto pInfoBar = AppendInfoBar("readonly", "", SfxResId(bSignPDF ? STR_READONLY_PDF : STR_READONLY_DOCUMENT), InfobarType::INFO); if (pInfoBar) { if (bSignPDF) @@ -3231,22 +3231,23 @@ void SfxViewFrame::SetViewFrame( SfxViewFrame* pFrame ) } VclPtr<SfxInfoBarWindow> SfxViewFrame::AppendInfoBar(const OUString& sId, - const OUString& sMessage, - InfoBarType aInfoBarType) + const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, + InfobarType aInfobarType, bool bShowCloseButton) { SfxChildWindow* pChild = GetChildWindow(SfxInfoBarContainerChild::GetChildWindowId()); if (!pChild) return nullptr; SfxInfoBarContainerWindow* pInfoBarContainer = static_cast<SfxInfoBarContainerWindow*>(pChild->GetWindow()); - auto pInfoBar = pInfoBarContainer->appendInfoBar(sId, sMessage, aInfoBarType, WB_LEFT | WB_VCENTER); + auto pInfoBar = pInfoBarContainer->appendInfoBar(sId, sPrimaryMessage, sSecondaryMessage, + aInfobarType, WB_LEFT | WB_VCENTER, bShowCloseButton); ShowChildWindow(SfxInfoBarContainerChild::GetChildWindowId()); return pInfoBar; } -void SfxViewFrame::UpdateInfoBar( const OUString& sId, - const OUString& sMessage, - InfoBarType eType ) +void SfxViewFrame::UpdateInfoBar(const OUString& sId, const OUString& sPrimaryMessage, + const OUString& sSecondaryMessage, InfobarType eType) { const sal_uInt16 nId = SfxInfoBarContainerChild::GetChildWindowId(); @@ -3261,7 +3262,7 @@ void SfxViewFrame::UpdateInfoBar( const OUString& sId, auto pInfoBar = pInfoBarContainer->getInfoBar(sId); if (pInfoBar) - pInfoBar->Update(sMessage, eType); + pInfoBar->Update(sPrimaryMessage, sSecondaryMessage, eType); } } |