include/sfx2/classificationhelper.hxx | 2 include/sfx2/infobar.hxx | 38 +++--- include/sfx2/sfxbasecontroller.hxx | 13 ++ include/sfx2/viewfrm.hxx | 13 +- include/vcl/button.hxx | 5 offapi/UnoApi_offapi.mk | 2 offapi/com/sun/star/frame/InfobarType.idl | 38 ++++++ offapi/com/sun/star/frame/XInfobarProvider.idl | 104 +++++++++++++++++ sc/source/ui/docshell/docsh4.cxx | 2 sfx2/source/dialog/infobar.cxx | 105 +++++++++++------ sfx2/source/doc/objserv.cxx | 18 +-- sfx2/source/view/classificationhelper.cxx | 22 +-- sfx2/source/view/sfxbasecontroller.cxx | 64 ++++++++++ sfx2/source/view/viewfrm.cxx | 23 ++- vcl/source/control/button.cxx | 148 ++++++++++++------------- 15 files changed, 430 insertions(+), 167 deletions(-)
New commits: commit 60c0874227201310c099fb717c0a665dbcf5bb33 Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> AuthorDate: Mon Nov 18 13:33:31 2019 +0100 Commit: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> CommitDate: Tue Nov 19 08:51:55 2019 +0100 tdf#84183 Give infobar close btn some 'clicked' state Slightly smaller cross when the button is clicked on to have some feedback for the user Change-Id: If0486319e9816378b2011bbb366b4c577c1ad84a Reviewed-on: https://gerrit.libreoffice.org/83087 Tested-by: Jenkins Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> diff --git a/include/vcl/button.hxx b/include/vcl/button.hxx index c39c466d1afe..b0b2884c9ad0 100644 --- a/include/vcl/button.hxx +++ b/include/vcl/button.hxx @@ -47,8 +47,6 @@ private: Button (const Button &) = delete; Button & operator= (const Button &) = delete; public: - SAL_DLLPRIVATE DrawButtonFlags ImplGetButtonState() const; - SAL_DLLPRIVATE DrawButtonFlags& ImplGetButtonState(); SAL_DLLPRIVATE DrawTextFlags ImplGetTextStyle( WinBits nWinStyle, DrawFlags nDrawFlags ); SAL_DLLPRIVATE void ImplDrawAlignedImage(OutputDevice* pDev, Point& rPos, Size& rSize, sal_uLong nImageSep, @@ -81,6 +79,9 @@ public: bool HasImage() const; void SetImageAlign( ImageAlign eAlign ); ImageAlign GetImageAlign() const; + DrawButtonFlags GetButtonState() const; + DrawButtonFlags& GetButtonState(); + bool IsSmallSymbol() const; void SetSmallSymbol(); diff --git a/sfx2/source/dialog/infobar.cxx b/sfx2/source/dialog/infobar.cxx index a1c9ef21cbee..ea99fc6b67d3 100644 --- a/sfx2/source/dialog/infobar.cxx +++ b/sfx2/source/dialog/infobar.cxx @@ -23,6 +23,7 @@ #include <sfx2/viewsh.hxx> #include <vcl/svapp.hxx> #include <vcl/settings.hxx> +#include <vcl/decoview.hxx> using namespace std; using namespace drawinglayer::geometry; @@ -114,11 +115,15 @@ public: void SfxCloseButton::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&) { + Point aBtnPos(0, 0); + if (GetButtonState() & DrawButtonFlags::Pressed) + aBtnPos.Move(Size(1, 1)); + const ViewInformation2D aNewViewInfos; const unique_ptr<BaseProcessor2D> pProcessor( createBaseProcessor2DFromOutputDevice(rRenderContext, aNewViewInfos)); - const ::tools::Rectangle aRect(Point(0, 0), PixelToLogic(GetSizePixel())); + const ::tools::Rectangle aRect(aBtnPos, PixelToLogic(GetSizePixel())); drawinglayer::primitive2d::Primitive2DContainer aSeq(2); diff --git a/vcl/source/control/button.cxx b/vcl/source/control/button.cxx index 6eb27669f306..53eaa3ff6b0c 100644 --- a/vcl/source/control/button.cxx +++ b/vcl/source/control/button.cxx @@ -480,12 +480,12 @@ const tools::Rectangle& Button::ImplGetFocusRect() const return mpButtonData->maFocusRect; } -DrawButtonFlags& Button::ImplGetButtonState() +DrawButtonFlags& Button::GetButtonState() { return mpButtonData->mnButtonState; } -DrawButtonFlags Button::ImplGetButtonState() const +DrawButtonFlags Button::GetButtonState() const { return mpButtonData->mnButtonState; } @@ -588,7 +588,7 @@ void PushButton::ImplInit( vcl::Window* pParent, WinBits nStyle ) Button::ImplInit( pParent, nStyle, nullptr ); if ( nStyle & WB_NOLIGHTBORDER ) - ImplGetButtonState() |= DrawButtonFlags::NoLightBorder; + GetButtonState() |= DrawButtonFlags::NoLightBorder; ImplInitSettings( true ); } @@ -792,7 +792,7 @@ void PushButton::ImplDrawPushButtonContent(OutputDevice* pDev, DrawFlags nDrawFl } else { - aColor = isAction() ? ((ImplGetButtonState() & DrawButtonFlags::Default) + aColor = isAction() ? ((GetButtonState() & DrawButtonFlags::Default) ? rStyleSettings.GetDefaultActionButtonTextColor() : rStyleSettings.GetActionButtonTextColor()) : rStyleSettings.GetButtonTextColor(); @@ -883,7 +883,7 @@ void PushButton::ImplDrawPushButton(vcl::RenderContext& rRenderContext) { HideFocus(); - DrawButtonFlags nButtonStyle = ImplGetButtonState(); + DrawButtonFlags nButtonStyle = GetButtonState(); Size aOutSz(GetOutputSizePixel()); tools::Rectangle aRect(Point(), aOutSz); tools::Rectangle aInRect = aRect; @@ -945,11 +945,11 @@ void PushButton::ImplDrawPushButton(vcl::RenderContext& rRenderContext) if (mbPressed || mbIsActive) nState |= ControlState::PRESSED; - if (ImplGetButtonState() & DrawButtonFlags::Pressed) + if (GetButtonState() & DrawButtonFlags::Pressed) nState |= ControlState::PRESSED; if (HasFocus()) nState |= ControlState::FOCUSED; - if (ImplGetButtonState() & DrawButtonFlags::Default) + if (GetButtonState() & DrawButtonFlags::Default) nState |= ControlState::DEFAULT; if (Window::IsEnabled()) nState |= ControlState::ENABLED; @@ -996,11 +996,11 @@ void PushButton::ImplDrawPushButton(vcl::RenderContext& rRenderContext) nState |= ControlState::PRESSED; nButtonStyle |= DrawButtonFlags::Pressed; } - if (ImplGetButtonState() & DrawButtonFlags::Pressed) + if (GetButtonState() & DrawButtonFlags::Pressed) nState |= ControlState::PRESSED; if (HasFocus()) nState |= ControlState::FOCUSED; - if (ImplGetButtonState() & DrawButtonFlags::Default) + if (GetButtonState() & DrawButtonFlags::Default) nState |= ControlState::DEFAULT; if (Window::IsEnabled()) nState |= ControlState::ENABLED; @@ -1116,25 +1116,25 @@ void PushButton::ImplSetDefButton( bool bSet ) if ( bSet ) { - if( !(ImplGetButtonState() & DrawButtonFlags::Default) && bSetPos ) + if( !(GetButtonState() & DrawButtonFlags::Default) && bSetPos ) { // adjust pos/size when toggling from non-default to default aPos.Move(-dLeft, -dTop); aSize.AdjustWidth(dLeft + dRight ); aSize.AdjustHeight(dTop + dBottom ); } - ImplGetButtonState() |= DrawButtonFlags::Default; + GetButtonState() |= DrawButtonFlags::Default; } else { - if( (ImplGetButtonState() & DrawButtonFlags::Default) && bSetPos ) + if( (GetButtonState() & DrawButtonFlags::Default) && bSetPos ) { // adjust pos/size when toggling from default to non-default aPos.Move(dLeft, dTop); aSize.AdjustWidth( -(dLeft + dRight) ); aSize.AdjustHeight( -(dTop + dBottom) ); } - ImplGetButtonState() &= ~DrawButtonFlags::Default; + GetButtonState() &= ~DrawButtonFlags::Default; } if( bSetPos ) setPosSizePixel( aPos.X(), aPos.Y(), aSize.Width(), aSize.Height() ); @@ -1144,7 +1144,7 @@ void PushButton::ImplSetDefButton( bool bSet ) bool PushButton::ImplIsDefButton() const { - return bool(ImplGetButtonState() & DrawButtonFlags::Default); + return bool(GetButtonState() & DrawButtonFlags::Default); } PushButton::PushButton( WindowType nType ) : @@ -1171,7 +1171,7 @@ void PushButton::MouseButtonDown( const MouseEvent& rMEvt ) ! ( GetStyle() & WB_TOGGLE ) ) nTrackFlags |= StartTrackingFlags::ButtonRepeat; - ImplGetButtonState() |= DrawButtonFlags::Pressed; + GetButtonState() |= DrawButtonFlags::Pressed; Invalidate(); StartTracking( nTrackFlags ); @@ -1184,7 +1184,7 @@ void PushButton::Tracking( const TrackingEvent& rTEvt ) { if ( rTEvt.IsTrackingEnded() ) { - if ( ImplGetButtonState() & DrawButtonFlags::Pressed ) + if ( GetButtonState() & DrawButtonFlags::Pressed ) { if ( !(GetStyle() & WB_NOPOINTERFOCUS) && !rTEvt.IsTrackingCanceled() ) GrabFocus(); @@ -1197,14 +1197,14 @@ void PushButton::Tracking( const TrackingEvent& rTEvt ) if ( IsChecked() ) { Check( false ); - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; } else Check(); } } else - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); @@ -1221,7 +1221,7 @@ void PushButton::Tracking( const TrackingEvent& rTEvt ) { if ( ImplHitTestPushButton( this, rTEvt.GetMouseEvent().GetPosPixel() ) ) { - if ( ImplGetButtonState() & DrawButtonFlags::Pressed ) + if ( GetButtonState() & DrawButtonFlags::Pressed ) { if ( rTEvt.IsTrackingRepeat() && (GetStyle() & WB_REPEAT) && ! ( GetStyle() & WB_TOGGLE ) ) @@ -1229,15 +1229,15 @@ void PushButton::Tracking( const TrackingEvent& rTEvt ) } else { - ImplGetButtonState() |= DrawButtonFlags::Pressed; + GetButtonState() |= DrawButtonFlags::Pressed; Invalidate(); } } else { - if ( ImplGetButtonState() & DrawButtonFlags::Pressed ) + if ( GetButtonState() & DrawButtonFlags::Pressed ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); } } @@ -1251,9 +1251,9 @@ void PushButton::KeyInput( const KeyEvent& rKEvt ) if ( !aKeyCode.GetModifier() && ((aKeyCode.GetCode() == KEY_RETURN) || (aKeyCode.GetCode() == KEY_SPACE)) ) { - if ( !(ImplGetButtonState() & DrawButtonFlags::Pressed) ) + if ( !(GetButtonState() & DrawButtonFlags::Pressed) ) { - ImplGetButtonState() |= DrawButtonFlags::Pressed; + GetButtonState() |= DrawButtonFlags::Pressed; Invalidate(); } @@ -1261,9 +1261,9 @@ void PushButton::KeyInput( const KeyEvent& rKEvt ) ! ( GetStyle() & WB_TOGGLE ) ) Click(); } - else if ( (ImplGetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_ESCAPE) ) + else if ( (GetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_ESCAPE) ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); } else @@ -1274,7 +1274,7 @@ void PushButton::KeyUp( const KeyEvent& rKEvt ) { vcl::KeyCode aKeyCode = rKEvt.GetKeyCode(); - if ( (ImplGetButtonState() & DrawButtonFlags::Pressed) && + if ( (GetButtonState() & DrawButtonFlags::Pressed) && ((aKeyCode.GetCode() == KEY_RETURN) || (aKeyCode.GetCode() == KEY_SPACE)) ) { if ( GetStyle() & WB_TOGGLE ) @@ -1282,7 +1282,7 @@ void PushButton::KeyUp( const KeyEvent& rKEvt ) if ( IsChecked() ) { Check( false ); - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; } else Check(); @@ -1290,7 +1290,7 @@ void PushButton::KeyUp( const KeyEvent& rKEvt ) Toggle(); } else - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); @@ -1535,16 +1535,16 @@ void PushButton::SetState( TriState eState ) { meState = eState; if ( meState == TRISTATE_FALSE ) - ImplGetButtonState() &= ~DrawButtonFlags(DrawButtonFlags::Checked | DrawButtonFlags::DontKnow); + GetButtonState() &= ~DrawButtonFlags(DrawButtonFlags::Checked | DrawButtonFlags::DontKnow); else if ( meState == TRISTATE_TRUE ) { - ImplGetButtonState() &= ~DrawButtonFlags::DontKnow; - ImplGetButtonState() |= DrawButtonFlags::Checked; + GetButtonState() &= ~DrawButtonFlags::DontKnow; + GetButtonState() |= DrawButtonFlags::Checked; } else // TRISTATE_INDET { - ImplGetButtonState() &= ~DrawButtonFlags::Checked; - ImplGetButtonState() |= DrawButtonFlags::DontKnow; + GetButtonState() &= ~DrawButtonFlags::Checked; + GetButtonState() |= DrawButtonFlags::DontKnow; } CompatStateChanged( StateChangedType::State ); @@ -1572,9 +1572,9 @@ void PushButton::EndSelection() { EndTracking( TrackingEventFlags::Cancel ); if ( !IsDisposed() && - ImplGetButtonState() & DrawButtonFlags::Pressed ) + GetButtonState() & DrawButtonFlags::Pressed ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; if ( !mbPressed ) Invalidate(); } @@ -1874,11 +1874,11 @@ void RadioButton::ImplDrawRadioButtonState(vcl::RenderContext& rRenderContext) tools::Rectangle aCtrlRect(maStateRect.TopLeft(), maStateRect.GetSize()); ControlState nState = ControlState::NONE; - if (ImplGetButtonState() & DrawButtonFlags::Pressed) + if (GetButtonState() & DrawButtonFlags::Pressed) nState |= ControlState::PRESSED; if (HasFocus()) nState |= ControlState::FOCUSED; - if (ImplGetButtonState() & DrawButtonFlags::Default) + if (GetButtonState() & DrawButtonFlags::Default) nState |= ControlState::DEFAULT; if (IsEnabled()) nState |= ControlState::ENABLED; @@ -1894,7 +1894,7 @@ void RadioButton::ImplDrawRadioButtonState(vcl::RenderContext& rRenderContext) { if (!maImage) { - DrawButtonFlags nStyle = ImplGetButtonState(); + DrawButtonFlags nStyle = GetButtonState(); if (!IsEnabled()) nStyle |= DrawButtonFlags::Disabled; if (mbChecked) @@ -1925,7 +1925,7 @@ void RadioButton::ImplDrawRadioButtonState(vcl::RenderContext& rRenderContext) // display border and selection status aImageRect = aDecoView.DrawFrame(aImageRect, DrawFrameStyle::DoubleIn); - if ((ImplGetButtonState() & DrawButtonFlags::Pressed) || !bEnabled) + if ((GetButtonState() & DrawButtonFlags::Pressed) || !bEnabled) rRenderContext.SetFillColor( rStyleSettings.GetFaceColor()); else rRenderContext.SetFillColor(rStyleSettings.GetFieldColor()); @@ -2278,7 +2278,7 @@ void RadioButton::MouseButtonDown( const MouseEvent& rMEvt ) { if ( rMEvt.IsLeft() && maMouseRect.IsInside( rMEvt.GetPosPixel() ) ) { - ImplGetButtonState() |= DrawButtonFlags::Pressed; + GetButtonState() |= DrawButtonFlags::Pressed; Invalidate(); Update(); StartTracking(); @@ -2292,12 +2292,12 @@ void RadioButton::Tracking( const TrackingEvent& rTEvt ) { if ( rTEvt.IsTrackingEnded() ) { - if ( ImplGetButtonState() & DrawButtonFlags::Pressed ) + if ( GetButtonState() & DrawButtonFlags::Pressed ) { if ( !(GetStyle() & WB_NOPOINTERFOCUS) && !rTEvt.IsTrackingCanceled() ) GrabFocus(); - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; // do not call click handler if aborted if ( !rTEvt.IsTrackingCanceled() ) @@ -2313,18 +2313,18 @@ void RadioButton::Tracking( const TrackingEvent& rTEvt ) { if ( maMouseRect.IsInside( rTEvt.GetMouseEvent().GetPosPixel() ) ) { - if ( !(ImplGetButtonState() & DrawButtonFlags::Pressed) ) + if ( !(GetButtonState() & DrawButtonFlags::Pressed) ) { - ImplGetButtonState() |= DrawButtonFlags::Pressed; + GetButtonState() |= DrawButtonFlags::Pressed; Invalidate(); Update(); } } else { - if ( ImplGetButtonState() & DrawButtonFlags::Pressed ) + if ( GetButtonState() & DrawButtonFlags::Pressed ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); Update(); } @@ -2338,16 +2338,16 @@ void RadioButton::KeyInput( const KeyEvent& rKEvt ) if ( !aKeyCode.GetModifier() && (aKeyCode.GetCode() == KEY_SPACE) ) { - if ( !(ImplGetButtonState() & DrawButtonFlags::Pressed) ) + if ( !(GetButtonState() & DrawButtonFlags::Pressed) ) { - ImplGetButtonState() |= DrawButtonFlags::Pressed; + GetButtonState() |= DrawButtonFlags::Pressed; Invalidate(); Update(); } } - else if ( (ImplGetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_ESCAPE) ) + else if ( (GetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_ESCAPE) ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); Update(); } @@ -2359,9 +2359,9 @@ void RadioButton::KeyUp( const KeyEvent& rKEvt ) { vcl::KeyCode aKeyCode = rKEvt.GetKeyCode(); - if ( (ImplGetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_SPACE) ) + if ( (GetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_SPACE) ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; ImplCallClick(); } else @@ -2468,9 +2468,9 @@ void RadioButton::GetFocus() void RadioButton::LoseFocus() { - if ( ImplGetButtonState() & DrawButtonFlags::Pressed ) + if ( GetButtonState() & DrawButtonFlags::Pressed ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); Update(); } @@ -2969,9 +2969,9 @@ void CheckBox::ImplDrawCheckBoxState(vcl::RenderContext& rRenderContext) if (HasFocus()) nState |= ControlState::FOCUSED; - if (ImplGetButtonState() & DrawButtonFlags::Default) + if (GetButtonState() & DrawButtonFlags::Default) nState |= ControlState::DEFAULT; - if (ImplGetButtonState() & DrawButtonFlags::Pressed) + if (GetButtonState() & DrawButtonFlags::Pressed) nState |= ControlState::PRESSED; if (IsEnabled()) nState |= ControlState::ENABLED; @@ -2990,7 +2990,7 @@ void CheckBox::ImplDrawCheckBoxState(vcl::RenderContext& rRenderContext) if (!bNativeOK) { - DrawButtonFlags nStyle = ImplGetButtonState(); + DrawButtonFlags nStyle = GetButtonState(); if (!IsEnabled()) nStyle |= DrawButtonFlags::Disabled; if (meState == TRISTATE_INDET) @@ -3135,7 +3135,7 @@ void CheckBox::MouseButtonDown( const MouseEvent& rMEvt ) { if ( rMEvt.IsLeft() && maMouseRect.IsInside( rMEvt.GetPosPixel() ) ) { - ImplGetButtonState() |= DrawButtonFlags::Pressed; + GetButtonState() |= DrawButtonFlags::Pressed; Invalidate(); Update(); StartTracking(); @@ -3149,12 +3149,12 @@ void CheckBox::Tracking( const TrackingEvent& rTEvt ) { if ( rTEvt.IsTrackingEnded() ) { - if ( ImplGetButtonState() & DrawButtonFlags::Pressed ) + if ( GetButtonState() & DrawButtonFlags::Pressed ) { if ( !(GetStyle() & WB_NOPOINTERFOCUS) && !rTEvt.IsTrackingCanceled() ) GrabFocus(); - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; // do not call click handler if aborted if ( !rTEvt.IsTrackingCanceled() ) @@ -3170,18 +3170,18 @@ void CheckBox::Tracking( const TrackingEvent& rTEvt ) { if ( maMouseRect.IsInside( rTEvt.GetMouseEvent().GetPosPixel() ) ) { - if ( !(ImplGetButtonState() & DrawButtonFlags::Pressed) ) + if ( !(GetButtonState() & DrawButtonFlags::Pressed) ) { - ImplGetButtonState() |= DrawButtonFlags::Pressed; + GetButtonState() |= DrawButtonFlags::Pressed; Invalidate(); Update(); } } else { - if ( ImplGetButtonState() & DrawButtonFlags::Pressed ) + if ( GetButtonState() & DrawButtonFlags::Pressed ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); Update(); } @@ -3195,16 +3195,16 @@ void CheckBox::KeyInput( const KeyEvent& rKEvt ) if ( !aKeyCode.GetModifier() && (aKeyCode.GetCode() == KEY_SPACE) ) { - if ( !(ImplGetButtonState() & DrawButtonFlags::Pressed) ) + if ( !(GetButtonState() & DrawButtonFlags::Pressed) ) { - ImplGetButtonState() |= DrawButtonFlags::Pressed; + GetButtonState() |= DrawButtonFlags::Pressed; Invalidate(); Update(); } } - else if ( (ImplGetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_ESCAPE) ) + else if ( (GetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_ESCAPE) ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); Update(); } @@ -3216,9 +3216,9 @@ void CheckBox::KeyUp( const KeyEvent& rKEvt ) { vcl::KeyCode aKeyCode = rKEvt.GetKeyCode(); - if ( (ImplGetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_SPACE) ) + if ( (GetButtonState() & DrawButtonFlags::Pressed) && (aKeyCode.GetCode() == KEY_SPACE) ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; ImplCheck(); } else @@ -3367,9 +3367,9 @@ void CheckBox::GetFocus() void CheckBox::LoseFocus() { - if ( ImplGetButtonState() & DrawButtonFlags::Pressed ) + if ( GetButtonState() & DrawButtonFlags::Pressed ) { - ImplGetButtonState() &= ~DrawButtonFlags::Pressed; + GetButtonState() &= ~DrawButtonFlags::Pressed; Invalidate(); Update(); } @@ -3770,7 +3770,7 @@ void DisclosureButton::ImplDrawCheckBoxState(vcl::RenderContext& rRenderContext) if (HasFocus()) nState |= ControlState::FOCUSED; - if (ImplGetButtonState() & DrawButtonFlags::Default) + if (GetButtonState() & DrawButtonFlags::Default) nState |= ControlState::DEFAULT; if (Window::IsEnabled()) nState |= ControlState::ENABLED; commit 9e3ba7c3036c4d21e01d6f75ed29a1e8c4208141 Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> AuthorDate: Mon Nov 18 09:08:03 2019 +0100 Commit: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> CommitDate: Tue Nov 19 08:51:43 2019 +0100 tdf#97926 Add UNO API for Infobar This allows creating, updating and removing infobars from macros/extensions. It also extends the infobar with a primary and a secondary text, so there can be a bold summary at the beginning at the infobar with a longer text following in normal letters. Macro sample: ------------------------------------------------------------ Sub AddInfobar dim buttons(1) as new com.sun.star.beans.StringPair buttons(0).first = "Close doc" buttons(0).second = ".uno:CloseDoc" buttons(1).first = "Paste into doc" buttons(1).second = ".uno:Paste" ThisComponent.getCurrentController().appendInfobar("my", "Hello world", "Things happened. What now?", com.sun.star.frame.InfobarType.INFO, buttons, true) End Sub Sub UpdateInfobar ThisComponent.getCurrentController().updateInfobar("my", "WARNING","Do not read this message.", com.sun.star.frame.InfobarType.WARNING) End Sub Sub RemoveInfobar ThisComponent.getCurrentController().removeInfobar("my") End Sub ------------------------------------------------------------ Change-Id: I5d0a223525845d23ffab17acdaa431e0eb783fec Reviewed-on: https://gerrit.libreoffice.org/29816 Reviewed-by: Serge Krot (CIB) <serge.k...@cib.de> Tested-by: Serge Krot (CIB) <serge.k...@cib.de> Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> diff --git a/include/sfx2/classificationhelper.hxx b/include/sfx2/classificationhelper.hxx index b372c8df20fd..ed55fe9c04ca 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 4543189c0373..a0dcdbd00f1d 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 final : 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 final : 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 4b7237fd4386..95a082cdae32 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 0b65d90857fd..fe336ba5f091 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 5fa55f8f191d..81dbf3c3441b 100644 --- a/offapi/UnoApi_offapi.mk +++ b/offapi/UnoApi_offapi.mk @@ -2584,6 +2584,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/frame,\ FrameActionEvent \ FrameSearchFlag \ IllegalArgumentIOException \ + InfobarType \ LayoutManagerEvents \ TerminationVetoException \ TitleChangedEvent \ @@ -2624,6 +2625,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 e1c9332b0c4e..ced26c3261d2 100644 --- a/sc/source/ui/docshell/docsh4.cxx +++ b/sc/source/ui/docshell/docsh4.cxx @@ -495,7 +495,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 512fe81d6efd..ff155a031383 100644 --- a/sfx2/source/doc/objserv.cxx +++ b/sfx2/source/doc/objserv.cxx @@ -1298,35 +1298,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: @@ -1338,7 +1338,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())); @@ -1353,7 +1353,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 57c6a50df38f..66d27a07375c 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 7812b560de2a..f4cf6768a8b3 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; @@ -1395,7 +1396,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()); @@ -1469,4 +1471,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 6dccb522c14b..80d66831f0bb 100644 --- a/sfx2/source/view/viewfrm.cxx +++ b/sfx2/source/view/viewfrm.cxx @@ -1300,7 +1300,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); if (pInfoBar) { VclPtrInstance<PushButton> xWhatsNewButton(&GetWindow()); @@ -1342,7 +1342,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)); @@ -1369,7 +1369,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)); @@ -1396,7 +1396,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) @@ -3283,22 +3283,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(); @@ -3313,7 +3314,7 @@ void SfxViewFrame::UpdateInfoBar( const OUString& sId, auto pInfoBar = pInfoBarContainer->getInfoBar(sId); if (pInfoBar) - pInfoBar->Update(sMessage, eType); + pInfoBar->Update(sPrimaryMessage, sSecondaryMessage, eType); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits