diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-05-02 12:39:43 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2018-05-03 21:55:24 +0200 |
commit | 7e64aaebce8667f7ab173ea3807c62f81138b4af (patch) | |
tree | 0fe1c975221f32b742a8a09aa05ed431b55f8d9a | |
parent | 55fcb23ea5caa509d8254910c581d234f7ec9199 (diff) |
weld SvxTextAttrPage
with a a11y rework to be more like the insert special char a11y
also, route a11y questions about a custom widgets parent to the gtk toolkits
underlying default implementation, keeping only questions about ourself to
be handled by the XAccessible
focus rectangles in RectCtl work again, seems that got lost somewhere
along the way
Change-Id: I62237d45668f4438aec6031cc5a48c38de21bf98
Reviewed-on: https://gerrit.libreoffice.org/53767
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
32 files changed, 1778 insertions, 267 deletions
diff --git a/cui/source/inc/backgrnd.hxx b/cui/source/inc/backgrnd.hxx index 8f5a9c96ff2a..a67caba32a2a 100644 --- a/cui/source/inc/backgrnd.hxx +++ b/cui/source/inc/backgrnd.hxx @@ -57,6 +57,7 @@ public: virtual void Reset( const SfxItemSet* rSet ) override; virtual void FillUserData() override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; /// Shift-ListBox activation void ShowSelector(); diff --git a/cui/source/inc/cuitabarea.hxx b/cui/source/inc/cuitabarea.hxx index ce7fea8d96e8..2790b5323888 100644 --- a/cui/source/inc/cuitabarea.hxx +++ b/cui/source/inc/cuitabarea.hxx @@ -204,6 +204,7 @@ public: virtual void ActivatePage(const SfxItemSet& rSet) override; virtual DeactivateRC DeactivatePage(SfxItemSet* pSet) override; virtual void PointChanged(vcl::Window* pWindow, RectPoint eRP) override; + virtual void PointChanged(weld::DrawingArea* pWindow, RectPoint eRP) override; void SetPageType(PageType nInType) { nPageType = nInType; } void SetDlgType(sal_uInt16 nInType) { nDlgType = nInType; } @@ -271,6 +272,7 @@ public: virtual void ActivatePage( const SfxItemSet& rSet ) override; virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; void SetColorList( XColorListRef const & pColorList ) { m_pColorList = pColorList; } void SetGradientList( XGradientListRef const & pGrdLst) @@ -332,6 +334,7 @@ public: virtual void ActivatePage( const SfxItemSet& rSet ) override; virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; void SetColorList( XColorListRef const & pColorList ) { m_pColorList = pColorList; } void SetPageType( PageType nInType ) { m_nPageType = nInType; } @@ -481,6 +484,7 @@ public: virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; void SetColorList( XColorListRef const & pColorList ) { m_pColorList = pColorList; } void SetHatchingList( XHatchListRef const & pHtchLst) @@ -564,6 +568,7 @@ public: virtual void ActivatePage( const SfxItemSet& rSet ) override; virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea*, RectPoint eRP ) override; void SetBitmapList( const XBitmapListRef& pBmpLst) { m_pBitmapList = pBmpLst; } void SetBmpChgd( ChangeType* pIn ) { m_pnBitmapListState = pIn; } @@ -623,6 +628,7 @@ public: virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea*, RectPoint eRP ) override; void SetColorList( XColorListRef const & pColorList ) { m_pColorList = pColorList; } void SetPatternList( XPatternListRef const & pPatternList) { m_pPatternList = pPatternList; } diff --git a/cui/source/inc/cuitabline.hxx b/cui/source/inc/cuitabline.hxx index eadb4e038f69..89c5ec790bb8 100644 --- a/cui/source/inc/cuitabline.hxx +++ b/cui/source/inc/cuitabline.hxx @@ -212,6 +212,7 @@ public: virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; virtual void FillUserData() override; diff --git a/cui/source/inc/dstribut.hxx b/cui/source/inc/dstribut.hxx index 0923746a2eca..a065fcf6c74f 100644 --- a/cui/source/inc/dstribut.hxx +++ b/cui/source/inc/dstribut.hxx @@ -50,6 +50,7 @@ public: virtual bool FillItemSet(SfxItemSet*) override; virtual void Reset(const SfxItemSet*) override; virtual void PointChanged(vcl::Window* pWindow, RectPoint eRP) override; + virtual void PointChanged(weld::DrawingArea* pWindow, RectPoint eRP) override; SvxDistributeHorizontal GetDistributeHor() const { return m_eDistributeHor; } SvxDistributeVertical GetDistributeVer() const { return m_eDistributeVer; } diff --git a/cui/source/inc/measure.hxx b/cui/source/inc/measure.hxx index 721f7d4f8244..2a9fb17d2b65 100644 --- a/cui/source/inc/measure.hxx +++ b/cui/source/inc/measure.hxx @@ -79,6 +79,7 @@ public: virtual void Reset( const SfxItemSet * ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; void Construct(); void SetView( const SdrView* pSdrView ) { pView = pSdrView; } diff --git a/cui/source/inc/textattr.hxx b/cui/source/inc/textattr.hxx index 5c96c71ab329..88a5f7d7113d 100644 --- a/cui/source/inc/textattr.hxx +++ b/cui/source/inc/textattr.hxx @@ -40,26 +40,6 @@ class SvxTextAttrPage : public SvxTabPage private: static const sal_uInt16 pRanges[]; - VclPtr<VclContainer> m_pDrawingText; - VclPtr<VclContainer> m_pCustomShapeText; - - VclPtr<TriStateBox> m_pTsbAutoGrowWidth; - VclPtr<TriStateBox> m_pTsbAutoGrowHeight; - VclPtr<TriStateBox> m_pTsbFitToSize; - VclPtr<TriStateBox> m_pTsbContour; - VclPtr<TriStateBox> m_pTsbWordWrapText; - VclPtr<TriStateBox> m_pTsbAutoGrowSize; - - VclPtr<VclFrame> m_pFlDistance; - VclPtr<MetricField> m_pMtrFldLeft; - VclPtr<MetricField> m_pMtrFldRight; - VclPtr<MetricField> m_pMtrFldTop; - VclPtr<MetricField> m_pMtrFldBottom; - - VclPtr<VclFrame> m_pFlPosition; - VclPtr<SvxRectCtl> m_pCtlPosition; - VclPtr<TriStateBox> m_pTsbFullWidth; - const SfxItemSet& rOutAttrs; SdrObjKind m_eObjKind; @@ -70,8 +50,25 @@ private: bool bWordWrapTextEnabled; bool bFitToSizeEnabled; - DECL_LINK( ClickFullWidthHdl_Impl, Button*, void ); - DECL_LINK( ClickHdl_Impl, Button*, void ); + std::unique_ptr<weld::Widget> m_xDrawingText; + std::unique_ptr<weld::Widget> m_xCustomShapeText; + std::unique_ptr<weld::CheckButton> m_xTsbAutoGrowWidth; + std::unique_ptr<weld::CheckButton> m_xTsbAutoGrowHeight; + std::unique_ptr<weld::CheckButton> m_xTsbFitToSize; + std::unique_ptr<weld::CheckButton> m_xTsbContour; + std::unique_ptr<weld::CheckButton> m_xTsbWordWrapText; + std::unique_ptr<weld::CheckButton> m_xTsbAutoGrowSize; + std::unique_ptr<weld::Frame> m_xFlDistance; + std::unique_ptr<weld::MetricSpinButton> m_xMtrFldLeft; + std::unique_ptr<weld::MetricSpinButton> m_xMtrFldRight; + std::unique_ptr<weld::MetricSpinButton> m_xMtrFldTop; + std::unique_ptr<weld::MetricSpinButton> m_xMtrFldBottom; + std::unique_ptr<weld::Frame> m_xFlPosition; + std::unique_ptr<RectCtl> m_xCtlPosition; + std::unique_ptr<weld::CheckButton> m_xTsbFullWidth; + + DECL_LINK(ClickFullWidthHdl_Impl, weld::Button&, void); + DECL_LINK(ClickHdl_Impl, weld::Button&, void); /** Return whether the text direction is from left to right (</sal_True>) or top to bottom (</sal_False>). @@ -80,9 +77,8 @@ private: public: - SvxTextAttrPage( vcl::Window* pWindow, const SfxItemSet& rInAttrs ); + SvxTextAttrPage(TabPageParent pWindow, const SfxItemSet& rInAttrs); virtual ~SvxTextAttrPage() override; - virtual void dispose() override; static VclPtr<SfxTabPage> Create( TabPageParent, const SfxItemSet* ); static const sal_uInt16* GetRanges() { return pRanges; } @@ -91,6 +87,7 @@ public: virtual void Reset( const SfxItemSet * ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; void Construct(); void SetObjKind(SdrObjKind eObjKind) { m_eObjKind = eObjKind; } diff --git a/cui/source/inc/transfrm.hxx b/cui/source/inc/transfrm.hxx index 8a24987a8842..94fa4836de51 100644 --- a/cui/source/inc/transfrm.hxx +++ b/cui/source/inc/transfrm.hxx @@ -150,6 +150,7 @@ public: virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; void Construct(); void SetView( const SdrView* pSdrView ) { mpView = pSdrView; } @@ -208,6 +209,7 @@ public: virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; void Construct(); void SetView( const SdrView* pSdrView ) { pView = pSdrView; } @@ -261,6 +263,7 @@ public: virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) override; + virtual void PointChanged( weld::DrawingArea* pWindow, RectPoint eRP ) override; void Construct(); void SetView( const SdrView* pSdrView ) { pView = pSdrView; } diff --git a/cui/source/tabpages/backgrnd.cxx b/cui/source/tabpages/backgrnd.cxx index 722b4a84624b..8e7243a98220 100644 --- a/cui/source/tabpages/backgrnd.cxx +++ b/cui/source/tabpages/backgrnd.cxx @@ -841,7 +841,12 @@ DeactivateRC SvxBackgroundTabPage::DeactivatePage( SfxItemSet* _pSet ) return DeactivateRC::LeavePage; } -void SvxBackgroundTabPage::PointChanged( vcl::Window* , RectPoint ) +void SvxBackgroundTabPage::PointChanged( vcl::Window*, RectPoint ) +{ + // has to be implemented so that position control can work +} + +void SvxBackgroundTabPage::PointChanged( weld::DrawingArea*, RectPoint ) { // has to be implemented so that position control can work } diff --git a/cui/source/tabpages/dstribut.cxx b/cui/source/tabpages/dstribut.cxx index bd6039f39974..e132a736d25b 100644 --- a/cui/source/tabpages/dstribut.cxx +++ b/cui/source/tabpages/dstribut.cxx @@ -102,6 +102,10 @@ void SvxDistributePage::PointChanged(vcl::Window* /*pWindow*/, RectPoint /*eRP*/ { } +void SvxDistributePage::PointChanged(weld::DrawingArea*, RectPoint /*eRP*/) +{ +} + /************************************************************************* |* |* read the delivered Item-Set diff --git a/cui/source/tabpages/measure.cxx b/cui/source/tabpages/measure.cxx index 657cf6199b32..963544eef73f 100644 --- a/cui/source/tabpages/measure.cxx +++ b/cui/source/tabpages/measure.cxx @@ -619,6 +619,11 @@ void SvxMeasurePage::PointChanged( vcl::Window* pWindow, RectPoint /*eRP*/ ) ChangeAttrHdl_Impl( pWindow ); } +void SvxMeasurePage::PointChanged( weld::DrawingArea*, RectPoint /*eRP*/ ) +{ + ChangeAttrHdl_Impl( m_pCtlPosition ); +} + IMPL_LINK( SvxMeasurePage, ClickAutoPosHdl_Impl, Button*, p, void ) { if( m_pTsbAutoPosH->GetState() == TRISTATE_TRUE ) diff --git a/cui/source/tabpages/textattr.cxx b/cui/source/tabpages/textattr.cxx index 1fe363be96ca..092ef3966ffa 100644 --- a/cui/source/tabpages/textattr.cxx +++ b/cui/source/tabpages/textattr.cxx @@ -53,8 +53,8 @@ const sal_uInt16 SvxTextAttrPage::pRanges[] = |* dialog (page) for copying objects |* \************************************************************************/ -SvxTextAttrPage::SvxTextAttrPage(vcl::Window* pWindow, const SfxItemSet& rInAttrs) - : SvxTabPage(pWindow,"TextAttributesPage","cui/ui/textattrtabpage.ui", rInAttrs) +SvxTextAttrPage::SvxTextAttrPage(TabPageParent pPage, const SfxItemSet& rInAttrs) + : SvxTabPage(pPage, "cui/ui/textattrtabpage.ui", "TextAttributesPage", rInAttrs) , rOutAttrs(rInAttrs) , m_eObjKind(OBJ_NONE) , bAutoGrowSizeEnabled(false) @@ -63,66 +63,43 @@ SvxTextAttrPage::SvxTextAttrPage(vcl::Window* pWindow, const SfxItemSet& rInAttr , bAutoGrowHeightEnabled(false) , bWordWrapTextEnabled(false) , bFitToSizeEnabled(false) + , m_xDrawingText(m_xBuilder->weld_widget("drawingtext")) + , m_xCustomShapeText(m_xBuilder->weld_widget("customshapetext")) + , m_xTsbAutoGrowWidth(m_xBuilder->weld_check_button("TSB_AUTOGROW_WIDTH")) + , m_xTsbAutoGrowHeight(m_xBuilder->weld_check_button("TSB_AUTOGROW_HEIGHT")) + , m_xTsbFitToSize(m_xBuilder->weld_check_button("TSB_FIT_TO_SIZE")) + , m_xTsbContour(m_xBuilder->weld_check_button("TSB_CONTOUR")) + , m_xTsbWordWrapText(m_xBuilder->weld_check_button("TSB_WORDWRAP_TEXT")) + , m_xTsbAutoGrowSize(m_xBuilder->weld_check_button("TSB_AUTOGROW_SIZE")) + , m_xFlDistance(m_xBuilder->weld_frame("FL_DISTANCE")) + , m_xMtrFldLeft(m_xBuilder->weld_metric_spin_button("MTR_FLD_LEFT", FUNIT_CM)) + , m_xMtrFldRight(m_xBuilder->weld_metric_spin_button("MTR_FLD_RIGHT", FUNIT_CM)) + , m_xMtrFldTop(m_xBuilder->weld_metric_spin_button("MTR_FLD_TOP", FUNIT_CM)) + , m_xMtrFldBottom(m_xBuilder->weld_metric_spin_button("MTR_FLD_BOTTOM", FUNIT_CM)) + , m_xFlPosition(m_xBuilder->weld_frame("FL_POSITION")) + , m_xCtlPosition(new RectCtl(*m_xBuilder, "CTL_POSITION", this)) + , m_xTsbFullWidth(m_xBuilder->weld_check_button("TSB_FULL_WIDTH")) { - get(m_pDrawingText, "drawingtext"); - get(m_pCustomShapeText, "customshapetext"); - get(m_pTsbAutoGrowWidth,"TSB_AUTOGROW_WIDTH"); - get(m_pTsbAutoGrowHeight,"TSB_AUTOGROW_HEIGHT"); - get(m_pTsbFitToSize,"TSB_FIT_TO_SIZE"); - get(m_pTsbContour,"TSB_CONTOUR"); - get(m_pTsbWordWrapText,"TSB_WORDWRAP_TEXT"); - get(m_pTsbAutoGrowSize,"TSB_AUTOGROW_SIZE"); - get(m_pFlDistance,"FL_DISTANCE"); - get(m_pMtrFldLeft,"MTR_FLD_LEFT"); - get(m_pMtrFldRight,"MTR_FLD_RIGHT"); - get(m_pMtrFldTop,"MTR_FLD_TOP"); - get(m_pMtrFldBottom,"MTR_FLD_BOTTOM"); - get(m_pFlPosition,"FL_POSITION"); - get(m_pCtlPosition,"CTL_POSITION"); - m_pCtlPosition->SetControlSettings(RectPoint::MM, 240, 100); - get(m_pTsbFullWidth,"TSB_FULL_WIDTH"); - + m_xCtlPosition->SetControlSettings(RectPoint::MM, 240, 100); FieldUnit eFUnit = GetModuleFieldUnit( rInAttrs ); - SetFieldUnit( *m_pMtrFldLeft, eFUnit ); - SetFieldUnit( *m_pMtrFldRight, eFUnit ); - SetFieldUnit( *m_pMtrFldTop, eFUnit ); - SetFieldUnit( *m_pMtrFldBottom, eFUnit ); - - Link<Button*,void> aLink( LINK( this, SvxTextAttrPage, ClickHdl_Impl ) ); - m_pTsbAutoGrowWidth->SetClickHdl( aLink ); - m_pTsbAutoGrowHeight->SetClickHdl( aLink ); - m_pTsbAutoGrowSize->SetClickHdl( aLink ); - m_pTsbFitToSize->SetClickHdl( aLink ); - m_pTsbContour->SetClickHdl( aLink ); - - m_pTsbFullWidth->SetClickHdl(LINK( this, SvxTextAttrPage, ClickFullWidthHdl_Impl ) ); + SetFieldUnit( *m_xMtrFldLeft, eFUnit ); + SetFieldUnit( *m_xMtrFldRight, eFUnit ); + SetFieldUnit( *m_xMtrFldTop, eFUnit ); + SetFieldUnit( *m_xMtrFldBottom, eFUnit ); + + Link<weld::Button&,void> aLink( LINK( this, SvxTextAttrPage, ClickHdl_Impl ) ); + m_xTsbAutoGrowWidth->connect_clicked( aLink ); + m_xTsbAutoGrowHeight->connect_clicked( aLink ); + m_xTsbAutoGrowSize->connect_clicked( aLink ); + m_xTsbFitToSize->connect_clicked( aLink ); + m_xTsbContour->connect_clicked( aLink ); + + m_xTsbFullWidth->connect_clicked(LINK( this, SvxTextAttrPage, ClickFullWidthHdl_Impl ) ); } SvxTextAttrPage::~SvxTextAttrPage() { - disposeOnce(); -} - -void SvxTextAttrPage::dispose() -{ - m_pDrawingText.clear(); - m_pCustomShapeText.clear(); - m_pTsbAutoGrowWidth.clear(); - m_pTsbAutoGrowHeight.clear(); - m_pTsbFitToSize.clear(); - m_pTsbContour.clear(); - m_pTsbWordWrapText.clear(); - m_pTsbAutoGrowSize.clear(); - m_pFlDistance.clear(); - m_pMtrFldLeft.clear(); - m_pMtrFldRight.clear(); - m_pMtrFldTop.clear(); - m_pMtrFldBottom.clear(); - m_pFlPosition.clear(); - m_pCtlPosition.clear(); - m_pTsbFullWidth.clear(); - SvxTabPage::dispose(); } /************************************************************************* @@ -144,11 +121,11 @@ void SvxTextAttrPage::Reset( const SfxItemSet* rAttrs ) if( pItem ) { long nValue = static_cast<const SdrMetricItem*>( pItem )->GetValue(); - SetMetricValue( *m_pMtrFldLeft, nValue, eUnit ); + SetMetricValue( *m_xMtrFldLeft, nValue, eUnit ); } else - m_pMtrFldLeft->SetText( "" ); - m_pMtrFldLeft->SaveValue(); + m_xMtrFldLeft->set_text(""); + m_xMtrFldLeft->save_value(); pItem = GetItem( *rAttrs, SDRATTR_TEXT_RIGHTDIST ); if( !pItem ) @@ -156,11 +133,11 @@ void SvxTextAttrPage::Reset( const SfxItemSet* rAttrs ) if( pItem ) { long nValue = static_cast<const SdrMetricItem*>( pItem )->GetValue(); - SetMetricValue( *m_pMtrFldRight, nValue, eUnit ); + SetMetricValue( *m_xMtrFldRight, nValue, eUnit ); } else - m_pMtrFldRight->SetText( "" ); - m_pMtrFldRight->SaveValue(); + m_xMtrFldRight->set_text(""); + m_xMtrFldRight->save_value(); pItem = GetItem( *rAttrs, SDRATTR_TEXT_UPPERDIST ); if( !pItem ) @@ -168,11 +145,11 @@ void SvxTextAttrPage::Reset( const SfxItemSet* rAttrs ) if( pItem ) { long nValue = static_cast<const SdrMetricItem*>( pItem )->GetValue(); - SetMetricValue( *m_pMtrFldTop, nValue, eUnit ); + SetMetricValue( *m_xMtrFldTop, nValue, eUnit ); } else - m_pMtrFldTop->SetText( "" ); - m_pMtrFldTop->SaveValue(); + m_xMtrFldTop->set_text(""); + m_xMtrFldTop->save_value(); pItem = GetItem( *rAttrs, SDRATTR_TEXT_LOWERDIST ); if( !pItem ) @@ -180,52 +157,48 @@ void SvxTextAttrPage::Reset( const SfxItemSet* rAttrs ) if( pItem ) { long nValue = static_cast<const SdrMetricItem*>(pItem)->GetValue(); - SetMetricValue( *m_pMtrFldBottom, nValue, eUnit ); + SetMetricValue( *m_xMtrFldBottom, nValue, eUnit ); } else - m_pMtrFldBottom->SetText( "" ); - m_pMtrFldBottom->SaveValue(); + m_xMtrFldBottom->set_text(""); + m_xMtrFldBottom->save_value(); // adjust to height and autogrowsize if ( rAttrs->GetItemState( SDRATTR_TEXT_AUTOGROWHEIGHT ) != SfxItemState::DONTCARE ) { - m_pTsbAutoGrowHeight->SetState( rAttrs->Get( SDRATTR_TEXT_AUTOGROWHEIGHT ). + m_xTsbAutoGrowHeight->set_state( rAttrs->Get( SDRATTR_TEXT_AUTOGROWHEIGHT ). GetValue() ? TRISTATE_TRUE : TRISTATE_FALSE ); - m_pTsbAutoGrowHeight->EnableTriState( false ); - m_pTsbAutoGrowSize->SetState( rAttrs->Get( SDRATTR_TEXT_AUTOGROWHEIGHT ). + m_xTsbAutoGrowSize->set_state( rAttrs->Get( SDRATTR_TEXT_AUTOGROWHEIGHT ). GetValue() ? TRISTATE_TRUE : TRISTATE_FALSE ); - m_pTsbAutoGrowSize->EnableTriState( false ); } else { - m_pTsbAutoGrowHeight->SetState( TRISTATE_INDET ); - m_pTsbAutoGrowSize->SetState( TRISTATE_INDET ); + m_xTsbAutoGrowHeight->set_state( TRISTATE_INDET ); + m_xTsbAutoGrowSize->set_state( TRISTATE_INDET ); } - m_pTsbAutoGrowHeight->SaveValue(); - m_pTsbAutoGrowSize->SaveValue(); + m_xTsbAutoGrowHeight->save_state(); + m_xTsbAutoGrowSize->save_state(); // adjust to width if ( rAttrs->GetItemState( SDRATTR_TEXT_AUTOGROWWIDTH ) != SfxItemState::DONTCARE ) { - m_pTsbAutoGrowWidth->SetState( rAttrs->Get( SDRATTR_TEXT_AUTOGROWWIDTH ). + m_xTsbAutoGrowWidth->set_state( rAttrs->Get( SDRATTR_TEXT_AUTOGROWWIDTH ). GetValue() ? TRISTATE_TRUE : TRISTATE_FALSE ); - m_pTsbAutoGrowWidth->EnableTriState( false ); } else - m_pTsbAutoGrowWidth->SetState( TRISTATE_INDET ); - m_pTsbAutoGrowWidth->SaveValue(); + m_xTsbAutoGrowWidth->set_state( TRISTATE_INDET ); + m_xTsbAutoGrowWidth->save_state(); // wordwrap text if ( rAttrs->GetItemState( SDRATTR_TEXT_WORDWRAP ) != SfxItemState::DONTCARE ) { - m_pTsbWordWrapText->SetState( rAttrs->Get( SDRATTR_TEXT_WORDWRAP ). + m_xTsbWordWrapText->set_state( rAttrs->Get( SDRATTR_TEXT_WORDWRAP ). GetValue() ? TRISTATE_TRUE : TRISTATE_FALSE ); - m_pTsbWordWrapText->EnableTriState( false ); } else - m_pTsbWordWrapText->SetState( TRISTATE_INDET ); - m_pTsbWordWrapText->SaveValue(); + m_xTsbWordWrapText->set_state( TRISTATE_INDET ); + m_xTsbWordWrapText->save_state(); // #103516# Do the setup based on states of hor/ver adjust @@ -240,8 +213,6 @@ void SvxTextAttrPage::Reset( const SfxItemSet* rAttrs ) SdrTextHorzAdjust eTHA = rAttrs->Get(SDRATTR_TEXT_HORZADJUST).GetValue(); RectPoint eRP = RectPoint::LB; - m_pTsbFullWidth->EnableTriState( false ); - // Translate item values into local anchor position. switch (eTVA) { @@ -289,51 +260,48 @@ void SvxTextAttrPage::Reset( const SfxItemSet* rAttrs ) if((bLeftToRight && (SDRTEXTHORZADJUST_BLOCK == eTHA)) || (!bLeftToRight && (SDRTEXTVERTADJUST_BLOCK == eTVA))) { // Move anchor to valid position. - ClickFullWidthHdl_Impl(nullptr); - m_pTsbFullWidth->SetState(TRISTATE_TRUE); + ClickFullWidthHdl_Impl(*m_xTsbFullWidth); + m_xTsbFullWidth->set_state(TRISTATE_TRUE); } - m_pCtlPosition->SetActualRP( eRP ); + m_xCtlPosition->SetActualRP( eRP ); } else { // VertAdjust or HorAdjust is not unequivocal - m_pCtlPosition->Reset(); + m_xCtlPosition->Reset(); - m_pCtlPosition->SetState(CTL_STATE::NOVERT); - m_pCtlPosition->DoCompletelyDisable(true); + m_xCtlPosition->SetState(CTL_STATE::NOVERT); + m_xCtlPosition->DoCompletelyDisable(true); - m_pTsbFullWidth->SetState(TRISTATE_INDET); - m_pFlPosition->Enable( false ); + m_xTsbFullWidth->set_state(TRISTATE_INDET); + m_xFlPosition->set_sensitive( false ); } // adjust to border - if ( rAttrs->GetItemState( SDRATTR_TEXT_FITTOSIZE ) != SfxItemState::DONTCARE ) + if (rAttrs->GetItemState(SDRATTR_TEXT_FITTOSIZE) != SfxItemState::DONTCARE) { drawing::TextFitToSizeType const eFTS = rAttrs->Get( SDRATTR_TEXT_FITTOSIZE ).GetValue(); if (eFTS == drawing::TextFitToSizeType_AUTOFIT || eFTS == drawing::TextFitToSizeType_NONE) - m_pTsbFitToSize->SetState( TRISTATE_FALSE ); + m_xTsbFitToSize->set_state( TRISTATE_FALSE ); else - m_pTsbFitToSize->SetState( TRISTATE_TRUE ); - - m_pTsbFitToSize->EnableTriState( false ); + m_xTsbFitToSize->set_state( TRISTATE_TRUE ); } else - m_pTsbFitToSize->SetState( TRISTATE_INDET ); - m_pTsbFitToSize->SaveValue(); + m_xTsbFitToSize->set_state( TRISTATE_INDET ); + m_xTsbFitToSize->save_state(); if( rAttrs->GetItemState( SDRATTR_TEXT_CONTOURFRAME ) != SfxItemState::DONTCARE ) { bool bContour = rAttrs->Get( SDRATTR_TEXT_CONTOURFRAME ).GetValue(); - m_pTsbContour->SetState( bContour ? TRISTATE_TRUE : TRISTATE_FALSE ); - m_pTsbContour->EnableTriState( false ); + m_xTsbContour->set_state( bContour ? TRISTATE_TRUE : TRISTATE_FALSE ); } else - m_pTsbContour->SetState( TRISTATE_INDET ); - m_pTsbContour->SaveValue(); + m_xTsbContour->set_state( TRISTATE_INDET ); + m_xTsbContour->save_state(); - ClickHdl_Impl( nullptr ); + ClickHdl_Impl(*m_xTsbContour); } /************************************************************************* @@ -351,62 +319,62 @@ bool SvxTextAttrPage::FillItemSet( SfxItemSet* rAttrs) sal_Int32 nValue; TriState eState; - if( m_pMtrFldLeft->IsValueChangedFromSaved() ) + if( m_xMtrFldLeft->get_value_changed_from_saved() ) { - nValue = GetCoreValue( *m_pMtrFldLeft, eUnit ); + nValue = GetCoreValue( *m_xMtrFldLeft, eUnit ); rAttrs->Put( makeSdrTextLeftDistItem( nValue ) ); } - if( m_pMtrFldRight->IsValueChangedFromSaved() ) + if( m_xMtrFldRight->get_value_changed_from_saved() ) { - nValue = GetCoreValue( *m_pMtrFldRight, eUnit ); + nValue = GetCoreValue( *m_xMtrFldRight, eUnit ); rAttrs->Put( makeSdrTextRightDistItem( nValue ) ); } - if( m_pMtrFldTop->IsValueChangedFromSaved() ) + if( m_xMtrFldTop->get_value_changed_from_saved() ) { - nValue = GetCoreValue( *m_pMtrFldTop, eUnit ); + nValue = GetCoreValue( *m_xMtrFldTop, eUnit ); rAttrs->Put( makeSdrTextUpperDistItem( nValue ) ); } - if( m_pMtrFldBottom->IsValueChangedFromSaved() ) + if( m_xMtrFldBottom->get_value_changed_from_saved() ) { - nValue = GetCoreValue( *m_pMtrFldBottom, eUnit ); + nValue = GetCoreValue( *m_xMtrFldBottom, eUnit ); rAttrs->Put( makeSdrTextLowerDistItem( nValue ) ); } - eState = m_pTsbAutoGrowHeight->GetState(); - if( m_pTsbAutoGrowHeight->IsValueChangedFromSaved() ) + eState = m_xTsbAutoGrowHeight->get_state(); + if( m_xTsbAutoGrowHeight->get_state_changed_from_saved() ) { rAttrs->Put( makeSdrTextAutoGrowHeightItem( TRISTATE_TRUE == eState ) ); } - eState = m_pTsbAutoGrowWidth->GetState(); - if( m_pTsbAutoGrowWidth->IsValueChangedFromSaved() ) + eState = m_xTsbAutoGrowWidth->get_state(); + if( m_xTsbAutoGrowWidth->get_state_changed_from_saved() ) { rAttrs->Put( makeSdrTextAutoGrowWidthItem( TRISTATE_TRUE == eState ) ); } - eState = m_pTsbAutoGrowSize->GetState(); - if( m_pTsbAutoGrowSize->IsValueChangedFromSaved() ) + eState = m_xTsbAutoGrowSize->get_state(); + if( m_xTsbAutoGrowSize->get_state_changed_from_saved() ) { rAttrs->Put( makeSdrTextAutoGrowHeightItem( TRISTATE_TRUE == eState ) ); } - eState = m_pTsbWordWrapText->GetState(); - if( m_pTsbWordWrapText->IsValueChangedFromSaved() ) + eState = m_xTsbWordWrapText->get_state(); + if( m_xTsbWordWrapText->get_state_changed_from_saved() ) { rAttrs->Put( makeSdrTextWordWrapItem( TRISTATE_TRUE == eState ) ); } - eState = m_pTsbContour->GetState(); - if( m_pTsbContour->IsValueChangedFromSaved() ) + eState = m_xTsbContour->get_state(); + if( m_xTsbContour->get_state_changed_from_saved() ) { rAttrs->Put( makeSdrTextContourFrameItem( TRISTATE_TRUE == eState ) ); } - eState = m_pTsbFitToSize->GetState(); - if( m_pTsbFitToSize->IsValueChangedFromSaved() ) + eState = m_xTsbFitToSize->get_state(); + if( m_xTsbFitToSize->get_state_changed_from_saved() ) { drawing::TextFitToSizeType eFTS; switch( eState ) @@ -421,7 +389,7 @@ bool SvxTextAttrPage::FillItemSet( SfxItemSet* rAttrs) } // centered - RectPoint eRP = m_pCtlPosition->GetActualRP(); + RectPoint eRP = m_xCtlPosition->GetActualRP(); SdrTextVertAdjust eTVA, eOldTVA; SdrTextHorzAdjust eTHA, eOldTHA; @@ -449,11 +417,11 @@ bool SvxTextAttrPage::FillItemSet( SfxItemSet* rAttrs) } // #103516# Do not change values if adjust controls were disabled. - bool bIsDisabled(m_pCtlPosition->IsCompletelyDisabled()); + bool bIsDisabled(m_xCtlPosition->IsCompletelyDisabled()); if(!bIsDisabled) { - if( m_pTsbFullWidth->GetState() == TRISTATE_TRUE ) + if( m_xTsbFullWidth->get_state() == TRISTATE_TRUE ) { if (IsTextDirectionLeftToRight()) eTHA = SDRTEXTHORZADJUST_BLOCK; @@ -491,8 +459,8 @@ void SvxTextAttrPage::Construct() // indeterminate, show them all bFitToSizeEnabled = bContourEnabled = bWordWrapTextEnabled = bAutoGrowSizeEnabled = bAutoGrowWidthEnabled = bAutoGrowHeightEnabled = true; - m_pCustomShapeText->Show(); - m_pDrawingText->Show(); + m_xCustomShapeText->show(); + m_xDrawingText->show(); break; case OBJ_TEXT: case OBJ_TITLETEXT: @@ -503,42 +471,76 @@ void SvxTextAttrPage::Construct() // adjusting width and height is ONLY possible for pure text objects bFitToSizeEnabled = bAutoGrowWidthEnabled = bAutoGrowHeightEnabled = true; - m_pCustomShapeText->Hide(); - m_pDrawingText->Show(); + m_xCustomShapeText->hide(); + m_xDrawingText->show(); break; case OBJ_CUSTOMSHAPE: bFitToSizeEnabled = bContourEnabled = bAutoGrowWidthEnabled = bAutoGrowHeightEnabled = false; bWordWrapTextEnabled = bAutoGrowSizeEnabled = true; - m_pDrawingText->Hide(); - m_pCustomShapeText->Show(); + m_xDrawingText->hide(); + m_xCustomShapeText->show(); break; default: bFitToSizeEnabled = bContourEnabled = true; bWordWrapTextEnabled = bAutoGrowSizeEnabled = bAutoGrowWidthEnabled = bAutoGrowHeightEnabled = false; - m_pCustomShapeText->Hide(); - m_pDrawingText->Show(); + m_xCustomShapeText->hide(); + m_xDrawingText->show(); break; } - m_pTsbAutoGrowHeight->Show( bAutoGrowHeightEnabled ); - m_pTsbAutoGrowWidth->Show( bAutoGrowWidthEnabled ); - m_pTsbFitToSize->Show( bFitToSizeEnabled ); - m_pTsbContour->Show( bContourEnabled ); - m_pTsbAutoGrowSize->Show( bAutoGrowSizeEnabled ); - m_pTsbWordWrapText->Show( bWordWrapTextEnabled ); + m_xTsbAutoGrowHeight->show( bAutoGrowHeightEnabled ); + m_xTsbAutoGrowWidth->show( bAutoGrowWidthEnabled ); + m_xTsbFitToSize->show( bFitToSizeEnabled ); + m_xTsbContour->show( bContourEnabled ); + m_xTsbAutoGrowSize->show( bAutoGrowSizeEnabled ); + m_xTsbWordWrapText->show( bWordWrapTextEnabled ); } -VclPtr<SfxTabPage> SvxTextAttrPage::Create( TabPageParent pWindow, - const SfxItemSet* rAttrs ) +VclPtr<SfxTabPage> SvxTextAttrPage::Create(TabPageParent pWindow, const SfxItemSet* rAttrs) { - return VclPtr<SvxTextAttrPage>::Create( pWindow.pParent, *rAttrs ); + return VclPtr<SvxTextAttrPage>::Create(pWindow, *rAttrs); } /** Check whether we have to uncheck the "Full width" check box. */ void SvxTextAttrPage::PointChanged( vcl::Window*, RectPoint eRP ) { - if (m_pTsbFullWidth->GetState() == TRISTATE_TRUE) + if (m_xTsbFullWidth->get_state() == TRISTATE_TRUE) + { + // Depending on write direction and currently checked anchor we have + // to uncheck the "full width" button. + if (IsTextDirectionLeftToRight()) + switch( eRP ) + { + case RectPoint::LT: + case RectPoint::LM: + case RectPoint::LB: + case RectPoint::RT: + case RectPoint::RM: + case RectPoint::RB: + m_xTsbFullWidth->set_state( TRISTATE_FALSE ); + break; + default: ;//prevent warning + } + else + switch (eRP) + { + case RectPoint::LT: + case RectPoint::MT: + case RectPoint::RT: + case RectPoint::LB: + case RectPoint::MB: + case RectPoint::RB: + m_xTsbFullWidth->set_state( TRISTATE_FALSE ); + break; + default: ;//prevent warning + } + } +} + +void SvxTextAttrPage::PointChanged(weld::DrawingArea*, RectPoint eRP) +{ + if (m_xTsbFullWidth->get_state() == TRISTATE_TRUE) { // Depending on write direction and currently checked anchor we have // to uncheck the "full width" button. @@ -551,7 +553,7 @@ void SvxTextAttrPage::PointChanged( vcl::Window*, RectPoint eRP ) case RectPoint::RT: case RectPoint::RM: case RectPoint::RB: - m_pTsbFullWidth->SetState( TRISTATE_FALSE ); + m_xTsbFullWidth->set_state( TRISTATE_FALSE ); break; default: ;//prevent warning } @@ -564,13 +566,14 @@ void SvxTextAttrPage::PointChanged( vcl::Window*, RectPoint eRP ) case RectPoint::LB: case RectPoint::MB: case RectPoint::RB: - m_pTsbFullWidth->SetState( TRISTATE_FALSE ); + m_xTsbFullWidth->set_state( TRISTATE_FALSE ); break; default: ;//prevent warning } } } + /************************************************************************* |* |* possibly changes the position of the position-control @@ -581,28 +584,28 @@ void SvxTextAttrPage::PointChanged( vcl::Window*, RectPoint eRP ) to be moved to a valid and adjacent position. This position depends on the current anchor position and the text writing direction. */ -IMPL_LINK_NOARG(SvxTextAttrPage, ClickFullWidthHdl_Impl, Button*, void) +IMPL_LINK_NOARG(SvxTextAttrPage, ClickFullWidthHdl_Impl, weld::Button&, void) { - if( m_pTsbFullWidth->GetState() == TRISTATE_TRUE ) + if( m_xTsbFullWidth->get_state() == TRISTATE_TRUE ) { if (IsTextDirectionLeftToRight()) { // Move text anchor to horizontal middle axis. - switch( m_pCtlPosition->GetActualRP() ) + switch( m_xCtlPosition->GetActualRP() ) { case RectPoint::LT: case RectPoint::RT: - m_pCtlPosition->SetActualRP( RectPoint::MT ); + m_xCtlPosition->SetActualRP( RectPoint::MT ); break; case RectPoint::LM: case RectPoint::RM: - m_pCtlPosition->SetActualRP( RectPoint::MM ); + m_xCtlPosition->SetActualRP( RectPoint::MM ); break; case RectPoint::LB: case RectPoint::RB: - m_pCtlPosition->SetActualRP( RectPoint::MB ); + m_xCtlPosition->SetActualRP( RectPoint::MB ); break; default: ;//prevent warning } @@ -610,21 +613,21 @@ IMPL_LINK_NOARG(SvxTextAttrPage, ClickFullWidthHdl_Impl, Button*, void) else { // Move text anchor to vertical middle axis. - switch( m_pCtlPosition->GetActualRP() ) + switch( m_xCtlPosition->GetActualRP() ) { case RectPoint::LT: case RectPoint::LB: - m_pCtlPosition->SetActualRP( RectPoint::LM ); + m_xCtlPosition->SetActualRP( RectPoint::LM ); break; case RectPoint::MT: case RectPoint::MB: - m_pCtlPosition->SetActualRP( RectPoint::MM ); + m_xCtlPosition->SetActualRP( RectPoint::MM ); break; case RectPoint::RT: case RectPoint::RB: - m_pCtlPosition->SetActualRP( RectPoint::RM ); + m_xCtlPosition->SetActualRP( RectPoint::RM ); break; default: ;//prevent warning } @@ -638,50 +641,50 @@ IMPL_LINK_NOARG(SvxTextAttrPage, ClickFullWidthHdl_Impl, Button*, void) |* \************************************************************************/ -IMPL_LINK(SvxTextAttrPage, ClickHdl_Impl, Button*, pButton, void) +IMPL_LINK(SvxTextAttrPage, ClickHdl_Impl, weld::Button&, rButton, void) { - if (pButton == m_pTsbAutoGrowSize) + if (&rButton == m_xTsbAutoGrowSize.get()) { - m_pTsbAutoGrowHeight->SetState(m_pTsbAutoGrowSize->GetState()); - if (m_pTsbAutoGrowSize->GetState() == TRISTATE_TRUE) + m_xTsbAutoGrowHeight->set_state(m_xTsbAutoGrowSize->get_state()); + if (m_xTsbAutoGrowSize->get_state() == TRISTATE_TRUE) { - m_pTsbFitToSize->SetState(TRISTATE_FALSE); - m_pTsbContour->SetState(TRISTATE_FALSE); + m_xTsbFitToSize->set_state(TRISTATE_FALSE); + m_xTsbContour->set_state(TRISTATE_FALSE); } } - else if (pButton == m_pTsbAutoGrowHeight) - m_pTsbAutoGrowSize->SetState(m_pTsbAutoGrowHeight->GetState()); + else if (&rButton == m_xTsbAutoGrowHeight.get()) + m_xTsbAutoGrowSize->set_state(m_xTsbAutoGrowHeight->get_state()); - bool bAutoGrowWidth = m_pTsbAutoGrowWidth->GetState() == TRISTATE_TRUE; - bool bAutoGrowHeight = m_pTsbAutoGrowHeight->GetState() == TRISTATE_TRUE; - bool bFitToSize = m_pTsbFitToSize->GetState() == TRISTATE_TRUE; - bool bContour = m_pTsbContour->GetState() == TRISTATE_TRUE; + bool bAutoGrowWidth = m_xTsbAutoGrowWidth->get_state() == TRISTATE_TRUE; + bool bAutoGrowHeight = m_xTsbAutoGrowHeight->get_state() == TRISTATE_TRUE; + bool bFitToSize = m_xTsbFitToSize->get_state() == TRISTATE_TRUE; + bool bContour = m_xTsbContour->get_state() == TRISTATE_TRUE; - m_pTsbContour->Enable( !bFitToSize && + m_xTsbContour->set_sensitive( !bFitToSize && !( ( bAutoGrowWidth && bAutoGrowWidthEnabled ) || ( bAutoGrowHeight && bAutoGrowHeightEnabled ) ) && bContourEnabled ); - m_pTsbAutoGrowWidth->Enable( !bFitToSize && + m_xTsbAutoGrowWidth->set_sensitive( !bFitToSize && !( bContour && bContourEnabled ) && bAutoGrowWidthEnabled ); - m_pTsbAutoGrowHeight->Enable( !bFitToSize && + m_xTsbAutoGrowHeight->set_sensitive( !bFitToSize && !( bContour && bContourEnabled ) && bAutoGrowHeightEnabled ); - m_pTsbFitToSize->Enable( !( ( bAutoGrowWidth && bAutoGrowWidthEnabled ) || ( bAutoGrowHeight && bAutoGrowHeightEnabled ) ) && + m_xTsbFitToSize->set_sensitive( !( ( bAutoGrowWidth && bAutoGrowWidthEnabled ) || ( bAutoGrowHeight && bAutoGrowHeightEnabled ) ) && !( bContour && bContourEnabled ) && bFitToSizeEnabled ); // #101901# enable/disable metric fields and decorations dependent of contour - m_pFlDistance->Enable(!bContour); + m_xFlDistance->set_sensitive(!bContour); if( bContour && bContourEnabled ) { - m_pMtrFldLeft->SetValue( 0 ); - m_pMtrFldRight->SetValue( 0 ); - m_pMtrFldTop->SetValue( 0 ); - m_pMtrFldBottom->SetValue( 0 ); + m_xMtrFldLeft->set_value(0, FUNIT_NONE); + m_xMtrFldRight->set_value(0, FUNIT_NONE); + m_xMtrFldTop->set_value(0, FUNIT_NONE); + m_xMtrFldBottom->set_value(0, FUNIT_NONE); } // #103516# Do the setup based on states of hor/ver adjust @@ -690,7 +693,7 @@ IMPL_LINK(SvxTextAttrPage, ClickHdl_Impl, Button*, pButton, void) bool bHorAndVer(SfxItemState::DONTCARE == eVState || SfxItemState::DONTCARE == eHState); // #83698# enable/disable text anchoring dependent of contour - m_pFlPosition->Enable(!bContour && !bHorAndVer); + m_xFlPosition->set_sensitive(!bContour && !bHorAndVer); } diff --git a/cui/source/tabpages/tparea.cxx b/cui/source/tabpages/tparea.cxx index 57492037a1e6..dbceed157716 100644 --- a/cui/source/tabpages/tparea.cxx +++ b/cui/source/tabpages/tparea.cxx @@ -397,6 +397,10 @@ void SvxAreaTabPage::PointChanged( vcl::Window* , RectPoint ) { } +void SvxAreaTabPage::PointChanged( weld::DrawingArea*, RectPoint ) +{ +} + void SvxAreaTabPage::CreatePage( sal_Int32 nId, SfxTabPage* pTab ) { if(nId == SOLID ) diff --git a/cui/source/tabpages/tpbitmap.cxx b/cui/source/tabpages/tpbitmap.cxx index b6b2d007294f..75ddd68ce72f 100644 --- a/cui/source/tabpages/tpbitmap.cxx +++ b/cui/source/tabpages/tpbitmap.cxx @@ -835,4 +835,8 @@ void SvxBitmapTabPage::PointChanged( vcl::Window* , RectPoint ) { } +void SvxBitmapTabPage::PointChanged( weld::DrawingArea*, RectPoint ) +{ +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/cui/source/tabpages/tphatch.cxx b/cui/source/tabpages/tphatch.cxx index 304a7868ea1b..78c70ba84923 100644 --- a/cui/source/tabpages/tphatch.cxx +++ b/cui/source/tabpages/tphatch.cxx @@ -594,6 +594,10 @@ void SvxHatchTabPage::PointChanged( vcl::Window*, RectPoint ) { } +void SvxHatchTabPage::PointChanged( weld::DrawingArea*, RectPoint ) +{ +} + void SvxHatchTabPage::DataChanged( const DataChangedEvent& rDCEvt ) { if ( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) ) diff --git a/cui/source/tabpages/tpline.cxx b/cui/source/tabpages/tpline.cxx index b19981a03ee1..e29acf095eac 100644 --- a/cui/source/tabpages/tpline.cxx +++ b/cui/source/tabpages/tpline.cxx @@ -1665,11 +1665,13 @@ IMPL_LINK_NOARG(SvxLineTabPage, ChangeTransparentHdl_Impl, Edit&, void) m_pCtlPreview->Invalidate(); } - void SvxLineTabPage::PointChanged( vcl::Window*, RectPoint ) { } +void SvxLineTabPage::PointChanged( weld::DrawingArea*, RectPoint ) +{ +} void SvxLineTabPage::FillUserData() { diff --git a/cui/source/tabpages/tppattern.cxx b/cui/source/tabpages/tppattern.cxx index b312b33c3a1a..b073d844bde0 100644 --- a/cui/source/tabpages/tppattern.cxx +++ b/cui/source/tabpages/tppattern.cxx @@ -549,7 +549,6 @@ void SvxPatternTabPage::ChangeColor_Impl() m_pCtlPreview->Invalidate(); } - void SvxPatternTabPage::PointChanged( vcl::Window* pWindow, RectPoint ) { if( pWindow == m_pCtlPixel ) @@ -565,6 +564,18 @@ void SvxPatternTabPage::PointChanged( vcl::Window* pWindow, RectPoint ) m_pPatternLB->SetNoSelection(); } +void SvxPatternTabPage::PointChanged( weld::DrawingArea*, RectPoint ) +{ + m_pBitmapCtl->SetBmpArray( m_pCtlPixel->GetBitmapPixelPtr() ); + + // get bitmap and display it + m_rXFSet.Put(XFillBitmapItem(OUString(), Graphic(m_pBitmapCtl->GetBitmapEx()))); + m_pCtlPreview->SetAttributes( m_aXFillAttr.GetItemSet() ); + m_pCtlPreview->Invalidate(); + + m_pPatternLB->SetNoSelection(); +} + sal_Int32 SvxPatternTabPage::SearchPatternList(const OUString& rPatternName) { long nCount = m_pPatternList->Count(); diff --git a/cui/source/tabpages/tpshadow.cxx b/cui/source/tabpages/tpshadow.cxx index e603ce9f4c1a..d03a37a7d98f 100644 --- a/cui/source/tabpages/tpshadow.cxx +++ b/cui/source/tabpages/tpshadow.cxx @@ -496,6 +496,12 @@ void SvxShadowTabPage::PointChanged( vcl::Window*, RectPoint ) ModifyShadowHdl_Impl( *m_pMtrTransparent ); } +void SvxShadowTabPage::PointChanged( weld::DrawingArea*, RectPoint ) +{ + // repaint shadow + ModifyShadowHdl_Impl( *m_pMtrTransparent ); +} + void SvxShadowTabPage::PageCreated(const SfxAllItemSet& aSet) { const SvxColorListItem* pColorListItem = aSet.GetItem<SvxColorListItem>(SID_COLOR_TABLE, false); diff --git a/cui/source/tabpages/tptrans.cxx b/cui/source/tabpages/tptrans.cxx index c8d99d39c35c..1f6fc20da7dd 100644 --- a/cui/source/tabpages/tptrans.cxx +++ b/cui/source/tabpages/tptrans.cxx @@ -487,6 +487,9 @@ void SvxTransparenceTabPage::PointChanged(vcl::Window* , RectPoint ) { } +void SvxTransparenceTabPage::PointChanged(weld::DrawingArea*, RectPoint) +{ +} // Preview-Methods diff --git a/cui/source/tabpages/transfrm.cxx b/cui/source/tabpages/transfrm.cxx index b455872dd343..570635d1737a 100644 --- a/cui/source/tabpages/transfrm.cxx +++ b/cui/source/tabpages/transfrm.cxx @@ -348,7 +348,6 @@ DeactivateRC SvxAngleTabPage::DeactivatePage( SfxItemSet* _pSet ) return DeactivateRC::LeavePage; } - void SvxAngleTabPage::PointChanged(vcl::Window* pWindow, RectPoint eRP) { if(pWindow == m_pCtlRect) @@ -413,6 +412,11 @@ void SvxAngleTabPage::PointChanged(vcl::Window* pWindow, RectPoint eRP) } } +void SvxAngleTabPage::PointChanged(weld::DrawingArea* /*pWindow*/, RectPoint /*eRP*/) +{ + assert(false); +} + /************************************************************************* |* |* dialog for changing slant and corner radius @@ -787,7 +791,11 @@ DeactivateRC SvxSlantTabPage::DeactivatePage( SfxItemSet* _pSet ) } -void SvxSlantTabPage::PointChanged( vcl::Window* , RectPoint ) +void SvxSlantTabPage::PointChanged( vcl::Window*, RectPoint ) +{ +} + +void SvxSlantTabPage::PointChanged( weld::DrawingArea*, RectPoint ) { } @@ -1539,7 +1547,6 @@ void SvxPositionSizeTabPage::GetTopLeftPosition(double& rfX, double& rfY, const } } - void SvxPositionSizeTabPage::PointChanged( vcl::Window* pWindow, RectPoint eRP ) { if( pWindow == m_pCtlPos ) @@ -1610,6 +1617,10 @@ void SvxPositionSizeTabPage::PointChanged( vcl::Window* pWindow, RectPoint eRP ) } } +void SvxPositionSizeTabPage::PointChanged(weld::DrawingArea* /*pWindow*/, RectPoint /*eRP*/) +{ + assert(false); +} void SvxPositionSizeTabPage::DisableResize() { diff --git a/cui/uiconfig/ui/textattrtabpage.ui b/cui/uiconfig/ui/textattrtabpage.ui index 7373946102a9..f5ee8ec34ed1 100644 --- a/cui/uiconfig/ui/textattrtabpage.ui +++ b/cui/uiconfig/ui/textattrtabpage.ui @@ -1,14 +1,31 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.20.0 --> +<!-- Generated with glade 3.20.4 --> <interface domain="cui"> <requires lib="gtk+" version="3.18"/> - <requires lib="LibreOffice" version="1.0"/> <object class="GtkAdjustment" id="adjustment1"> <property name="lower">-100</property> <property name="upper">100</property> <property name="step_increment">1</property> <property name="page_increment">10</property> </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="lower">-100</property> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment3"> + <property name="lower">-100</property> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment4"> + <property name="lower">-100</property> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> <object class="GtkBox" id="TextAttributesPage"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -173,12 +190,6 @@ <property name="top_attach">1</property> </packing> </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> </object> </child> </object> @@ -236,7 +247,7 @@ <property name="can_focus">False</property> <property name="label" translatable="yes" context="textattrtabpage|label4">_Left:</property> <property name="use_underline">True</property> - <property name="mnemonic_widget">MTR_FLD_LEFT:0.00cm</property> + <property name="mnemonic_widget">MTR_FLD_LEFT</property> <property name="xalign">0</property> </object> <packing> @@ -250,7 +261,7 @@ <property name="can_focus">False</property> <property name="label" translatable="yes" context="textattrtabpage|label5">_Right:</property> <property name="use_underline">True</property> - <property name="mnemonic_widget">MTR_FLD_RIGHT:0.00cm</property> + <property name="mnemonic_widget">MTR_FLD_RIGHT</property> <property name="xalign">0</property> </object> <packing> @@ -264,7 +275,7 @@ <property name="can_focus">False</property> <property name="label" translatable="yes" context="textattrtabpage|label6">_Top:</property> <property name="use_underline">True</property> - <property name="mnemonic_widget">MTR_FLD_TOP:0.00cm</property> + <property name="mnemonic_widget">MTR_FLD_TOP</property> <property name="xalign">0</property> </object> <packing> @@ -278,7 +289,7 @@ <property name="can_focus">False</property> <property name="label" translatable="yes" context="textattrtabpage|label7">_Bottom:</property> <property name="use_underline">True</property> - <property name="mnemonic_widget">MTR_FLD_BOTTOM:0.00cm</property> + <property name="mnemonic_widget">MTR_FLD_BOTTOM</property> <property name="xalign">0</property> </object> <packing> @@ -287,9 +298,10 @@ </packing> </child> <child> - <object class="GtkSpinButton" id="MTR_FLD_LEFT:0.00cm"> + <object class="GtkSpinButton" id="MTR_FLD_LEFT"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="activates_default">True</property> <property name="adjustment">adjustment1</property> <property name="digits">2</property> </object> @@ -299,10 +311,11 @@ </packing> </child> <child> - <object class="GtkSpinButton" id="MTR_FLD_RIGHT:0.00cm"> + <object class="GtkSpinButton" id="MTR_FLD_RIGHT"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="adjustment">adjustment1</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment2</property> <property name="digits">2</property> </object> <packing> @@ -311,10 +324,11 @@ </packing> </child> <child> - <object class="GtkSpinButton" id="MTR_FLD_TOP:0.00cm"> + <object class="GtkSpinButton" id="MTR_FLD_TOP"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="adjustment">adjustment1</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment3</property> <property name="digits">2</property> </object> <packing> @@ -323,10 +337,11 @@ </packing> </child> <child> - <object class="GtkSpinButton" id="MTR_FLD_BOTTOM:0.00cm"> + <object class="GtkSpinButton" id="MTR_FLD_BOTTOM"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="adjustment">adjustment1</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment4</property> <property name="digits">2</property> </object> <packing> @@ -359,7 +374,7 @@ <child> <object class="GtkFrame" id="FL_POSITION"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can_focus">True</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> @@ -377,11 +392,29 @@ <property name="orientation">vertical</property> <property name="spacing">6</property> <child> - <object class="svxlo-SvxRectCtl" id="CTL_POSITION"> + <object class="GtkScrolledWindow"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can_focus">True</property> <property name="halign">start</property> <property name="valign">center</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkDrawingArea" id="CTL_POSITION"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="halign">start</property> + <property name="valign">center</property> + </object> + </child> + </object> + </child> </object> <packing> <property name="expand">True</property> diff --git a/include/svx/dlgctrl.hxx b/include/svx/dlgctrl.hxx index 0cf9220cb34f..075a008fe0c0 100644 --- a/include/svx/dlgctrl.hxx +++ b/include/svx/dlgctrl.hxx @@ -24,6 +24,7 @@ #include <svx/svxdllapi.h> #include <svx/rectenum.hxx> #include <vcl/graph.hxx> +#include <vcl/weld.hxx> #include <svx/xtable.hxx> #include <rtl/ref.hxx> #include <o3tl/typed_flags_set.hxx> @@ -49,7 +50,12 @@ public: : SfxTabPage(pParent, rID, rUIXMLDescription, &rAttrSet) { } - virtual void PointChanged( vcl::Window* pWindow, RectPoint eRP ) = 0; + SvxTabPage(TabPageParent pParent, const OUString& rUIXMLDescription, const OString& rID, const SfxItemSet &rAttrSet) + : SfxTabPage(pParent, rUIXMLDescription, rID, &rAttrSet) + { + } + virtual void PointChanged(vcl::Window* pWindow, RectPoint eRP) = 0; + virtual void PointChanged(weld::DrawingArea* pArea, RectPoint eRP) = 0; }; /************************************************************************* @@ -69,6 +75,7 @@ namespace o3tl } class SvxRectCtlAccessibleContext; +class RectCtlAccessibleContext; class SvxPixelCtlAccessible; class SAL_WARN_UNUSED SVX_DLLPUBLIC SvxRectCtl : public Control @@ -141,6 +148,79 @@ public: void DoCompletelyDisable(bool bNew); }; +class SAL_WARN_UNUSED SVX_DLLPUBLIC RectCtl +{ +private: + std::unique_ptr<weld::DrawingArea> m_xControl; + VclPtr<SvxTabPage> m_pPage; + + SVX_DLLPRIVATE void InitSettings(vcl::RenderContext& rRenderContext); + SVX_DLLPRIVATE void InitRectBitmap(); + SVX_DLLPRIVATE BitmapEx& GetRectBitmap(); + SVX_DLLPRIVATE void Resize_Impl(); + +protected: + rtl::Reference<RectCtlAccessibleContext> pAccContext; + sal_uInt16 nBorderWidth; + sal_uInt16 nRadius; + Size m_aSize; + Point aPtLT, aPtMT, aPtRT; + Point aPtLM, aPtMM, aPtRM; + Point aPtLB, aPtMB, aPtRB; + Point aPtNew; + RectPoint eRP, eDefRP; + BitmapEx* pBitmap; + CTL_STATE m_nState; + + bool mbCompleteDisable : 1; + + void MarkToResetSettings(); + + RectPoint GetRPFromPoint( Point, bool bRTL = false ) const; + const Point& GetPointFromRP( RectPoint ) const; + Point SetActualRPWithoutInvalidate( RectPoint eNewRP ); // returns the last point + + Point GetApproxLogPtFromPixPt( const Point& rRoughPixelPoint ) const; +public: + RectCtl(weld::Builder& rBuilder, const OString& rDrawingId, SvxTabPage* pPage, + RectPoint eRpt = RectPoint::MM, sal_uInt16 nBorder = 200, sal_uInt16 nCircle = 80); + void SetControlSettings(RectPoint eRpt, sal_uInt16 nBorder, sal_uInt16 nCircl); + ~RectCtl(); + + DECL_LINK(DoPaint, weld::DrawingArea::draw_args, void); + DECL_LINK(DoResize, const Size& rSize, void); + DECL_LINK(DoMouseButtonDown, const MouseEvent&, void); + DECL_LINK(DoKeyDown, const KeyEvent&, bool); + DECL_LINK(DoGetFocus, weld::Widget&, void); + DECL_LINK(DoLoseFocus, weld::Widget&, void); + DECL_LINK(MarkToResetSettings, weld::Widget&, void); + + void Reset(); + RectPoint GetActualRP() const { return eRP;} + void SetActualRP( RectPoint eNewRP ); + + void SetState( CTL_STATE nState ); + + static const sal_uInt8 NO_CHILDREN = 9; // returns number of usable radio buttons + + tools::Rectangle CalculateFocusRectangle() const; + tools::Rectangle CalculateFocusRectangle( RectPoint eRectPoint ) const; + + css::uno::Reference<css::accessibility::XAccessible> getAccessibleParent() { return m_xControl->get_accessible_parent(); } + css::uno::Reference<css::accessibility::XAccessible> CreateAccessible(); + a11yrelationset get_accessible_relation_set() { return m_xControl->get_accessible_relation_set(); } + + RectPoint GetApproxRPFromPixPt( const css::awt::Point& rPixelPoint ) const; + + bool IsCompletelyDisabled() const { return mbCompleteDisable; } + void DoCompletelyDisable(bool bNew); + + bool IsVisible() const { return m_xControl->get_visible(); } + bool HasFocus() const { return m_xControl->has_focus(); } + void GrabFocus() { m_xControl->grab_focus(); } + Size GetSize() const { return m_aSize; } +}; + /************************************************************************* |* Control for editing bitmaps \************************************************************************/ diff --git a/include/vcl/layout.hxx b/include/vcl/layout.hxx index 9aff1794a53c..31ff24e2d2ee 100644 --- a/include/vcl/layout.hxx +++ b/include/vcl/layout.hxx @@ -623,6 +623,7 @@ private: Link<const MouseEvent&, void> m_aMouseReleaseHdl; Link<const KeyEvent&, bool> m_aKeyPressHdl; Link<const KeyEvent&, bool> m_aKeyReleaseHdl; + Link<VclDrawingArea&, void> m_aStyleUpdatedHdl; virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override { @@ -655,21 +656,24 @@ private: if (!m_aKeyReleaseHdl.Call(rKEvt)) Control::KeyUp(rKEvt); } - virtual void StateChanged(StateChangedType nType) override { Control::StateChanged(nType); if (nType == StateChangedType::ControlForeground || nType == StateChangedType::ControlBackground) + { + m_aStyleUpdatedHdl.Call(*this); Invalidate(); + } } - virtual void DataChanged(const DataChangedEvent& rDCEvt) override { Control::DataChanged(rDCEvt); if ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE)) + { + m_aStyleUpdatedHdl.Call(*this); Invalidate(); + } } - virtual FactoryFunction GetUITestFactory() const override { if (m_pFactoryFunction) @@ -721,6 +725,10 @@ public: { m_aKeyReleaseHdl = rLink; } + void SetStyleUpdatedHdl(const Link<VclDrawingArea&, void>& rLink) + { + m_aStyleUpdatedHdl = rLink; + } }; //Get first window of a pTopLevel window as diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 93f8657e6852..309c1447a80d 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -17,7 +17,10 @@ #include <vcl/field.hxx> #include <vcl/virdev.hxx> +#include <com/sun/star/accessibility/XAccessibleRelationSet.hpp> + typedef css::uno::Reference<css::accessibility::XAccessible> a11yref; +typedef css::uno::Reference<css::accessibility::XAccessibleRelationSet> a11yrelationset; namespace weld { @@ -697,6 +700,7 @@ protected: Link<const MouseEvent&, void> m_aMouseReleaseHdl; Link<const KeyEvent&, bool> m_aKeyPressHdl; Link<const KeyEvent&, bool> m_aKeyReleaseHdl; + Link<Widget&, void> m_aStyleUpdatedHdl; public: void connect_draw(const Link<draw_args, void>& rLink) { m_aDrawHdl = rLink; } @@ -715,9 +719,11 @@ public: } void connect_key_press(const Link<const KeyEvent&, bool>& rLink) { m_aKeyPressHdl = rLink; } void connect_key_release(const Link<const KeyEvent&, bool>& rLink) { m_aKeyReleaseHdl = rLink; } + void connect_style_updated(const Link<Widget&, void>& rLink) { m_aStyleUpdatedHdl = rLink; } virtual void queue_draw() = 0; virtual void queue_draw_area(int x, int y, int width, int height) = 0; virtual a11yref get_accessible_parent() = 0; + virtual a11yrelationset get_accessible_relation_set() = 0; }; class VCL_DLLPUBLIC Menu diff --git a/svx/source/accessibility/charmapacc.cxx b/svx/source/accessibility/charmapacc.cxx index 8e6da5d0029e..bb560b9e820d 100644 --- a/svx/source/accessibility/charmapacc.cxx +++ b/svx/source/accessibility/charmapacc.cxx @@ -116,15 +116,18 @@ void SvxShowCharSetAcc::implSelect(sal_Int32 nAccessibleChildIndex, bool bSelect css::awt::Rectangle SvxShowCharSetAcc::implGetBounds() { - const Point aOutPos;//( m_pParent->GetPosPixel() ); - Size aOutSize( m_pParent->GetSize()); - awt::Rectangle aRet; - aRet.X = aOutPos.X(); - aRet.Y = aOutPos.Y(); - aRet.Width = aOutSize.Width(); - aRet.Height = aOutSize.Height(); + if (m_pParent) + { + const Point aOutPos;//( m_pParent->GetPosPixel() ); + Size aOutSize( m_pParent->GetSize()); + + aRet.X = aOutPos.X(); + aRet.Y = aOutPos.Y(); + aRet.Width = aOutSize.Width(); + aRet.Height = aOutSize.Height(); + } return aRet; } @@ -136,11 +139,6 @@ sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleChildCount() return m_pParent->getMaxCharCount(); } -sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleIndexInParent() -{ - return 0; -} - uno::Reference< css::accessibility::XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleChild( sal_Int32 i ) { OExternalLockGuard aGuard( this ); @@ -162,7 +160,9 @@ uno::Reference< css::accessibility::XAccessible > SAL_CALL SvxShowCharSetAcc::ge { OExternalLockGuard aGuard( this ); - return m_pParent->getAccessibleParent(); + if (m_pParent) + return m_pParent->getAccessibleParent(); + return uno::Reference<css::accessibility::XAccessible>(); } sal_Int16 SAL_CALL SvxShowCharSetAcc::getAccessibleRole() diff --git a/svx/source/accessibility/svxrectctaccessiblecontext.cxx b/svx/source/accessibility/svxrectctaccessiblecontext.cxx index bc0d4501d60d..e6c0959d20d3 100644 --- a/svx/source/accessibility/svxrectctaccessiblecontext.cxx +++ b/svx/source/accessibility/svxrectctaccessiblecontext.cxx @@ -97,7 +97,6 @@ static long PointToIndex( RectPoint ePoint ) return nRet; } - SvxRectCtlAccessibleContext::SvxRectCtlAccessibleContext( const Reference< XAccessible >& rxParent, SvxRectCtl& rRepr ) : @@ -625,6 +624,309 @@ void SvxRectCtlAccessibleContext::ThrowExceptionIfNotAlive() throw lang::DisposedException(); } +RectCtlAccessibleContext::RectCtlAccessibleContext(RectCtl* pRepr) + : mpRepr(pRepr) + , mnSelectedChild(NOCHILDSELECTED) +{ + { + ::SolarMutexGuard aSolarGuard; + msName = SvxResId( RID_SVXSTR_RECTCTL_ACC_CORN_NAME ); + msDescription = SvxResId( RID_SVXSTR_RECTCTL_ACC_CORN_DESCR ); + } + + mvChildren.resize(MAX_NUM_OF_CHILDREN); +} + +RectCtlAccessibleContext::~RectCtlAccessibleContext() +{ + ensureDisposed(); +} + +IMPLEMENT_FORWARD_XINTERFACE2( RectCtlAccessibleContext, OAccessibleSelectionHelper, OAccessibleHelper_Base ) +IMPLEMENT_FORWARD_XTYPEPROVIDER2( RectCtlAccessibleContext, OAccessibleSelectionHelper, OAccessibleHelper_Base ) + +Reference< XAccessible > SAL_CALL RectCtlAccessibleContext::getAccessibleAtPoint( const awt::Point& rPoint ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + Reference< XAccessible > xRet; + + long nChild = mpRepr ? PointToIndex(mpRepr->GetApproxRPFromPixPt(rPoint)) : NOCHILDSELECTED; + + if (nChild != NOCHILDSELECTED) + xRet = getAccessibleChild( nChild ); + + return xRet; +} + +// XAccessibleContext +sal_Int32 SAL_CALL RectCtlAccessibleContext::getAccessibleChildCount() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + return SvxRectCtl::NO_CHILDREN; +} + +Reference< XAccessible > SAL_CALL RectCtlAccessibleContext::getAccessibleChild( sal_Int32 nIndex ) +{ + checkChildIndex( nIndex ); + + Reference< XAccessible > xChild(mvChildren[ nIndex ].get()); + if( !xChild.is() ) + { + ::SolarMutexGuard aSolarGuard; + + ::osl::MutexGuard aGuard( m_aMutex ); + + xChild = mvChildren[ nIndex ].get(); + + if (!xChild.is() && mpRepr) + { + const ChildIndexToPointData* p = IndexToPoint( nIndex ); + OUString aName(SvxResId(p->pResIdName)); + OUString aDescr(SvxResId(p->pResIdDescr)); + + tools::Rectangle aFocusRect( mpRepr->CalculateFocusRectangle( p->ePoint ) ); + + RectCtlChildAccessibleContext* pChild = new RectCtlChildAccessibleContext(this, aName, + aDescr, aFocusRect, nIndex ); + mvChildren[ nIndex ] = pChild; + xChild = pChild; + + // set actual state + if( mnSelectedChild == nIndex ) + pChild->setStateChecked( true ); + } + } + + return xChild; +} + +Reference< XAccessible > SAL_CALL RectCtlAccessibleContext::getAccessibleParent() +{ + if (mpRepr) + return mpRepr->getAccessibleParent(); + return uno::Reference<css::accessibility::XAccessible>(); +} + +sal_Int16 SAL_CALL RectCtlAccessibleContext::getAccessibleRole() +{ + return AccessibleRole::PANEL; +} + +OUString SAL_CALL RectCtlAccessibleContext::getAccessibleDescription() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + return msDescription + " Please use arrow key to selection."; +} + +OUString SAL_CALL RectCtlAccessibleContext::getAccessibleName() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + return msName; +} + +/** Return empty reference to indicate that the relation set is not + supported. +*/ +Reference< XAccessibleRelationSet > SAL_CALL RectCtlAccessibleContext::getAccessibleRelationSet() +{ + if (mpRepr) + return mpRepr->get_accessible_relation_set(); + return uno::Reference<css::accessibility::XAccessibleRelationSet>(); +} + +Reference< XAccessibleStateSet > SAL_CALL RectCtlAccessibleContext::getAccessibleStateSet() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper; + + if (mpRepr) + { + pStateSetHelper->AddState( AccessibleStateType::ENABLED ); + pStateSetHelper->AddState( AccessibleStateType::FOCUSABLE ); + if( mpRepr->HasFocus() ) + pStateSetHelper->AddState( AccessibleStateType::FOCUSED ); + pStateSetHelper->AddState( AccessibleStateType::OPAQUE ); + + pStateSetHelper->AddState( AccessibleStateType::SHOWING ); + + if( mpRepr->IsVisible() ) + pStateSetHelper->AddState( AccessibleStateType::VISIBLE ); + } + else + pStateSetHelper->AddState( AccessibleStateType::DEFUNC ); + + return pStateSetHelper; +} + +void SAL_CALL RectCtlAccessibleContext::grabFocus() +{ + ::SolarMutexGuard aSolarGuard; + ::osl::MutexGuard aGuard( m_aMutex ); + + if (mpRepr) + mpRepr->GrabFocus(); +} + +sal_Int32 RectCtlAccessibleContext::getForeground() +{ + ::SolarMutexGuard aSolarGuard; + ::osl::MutexGuard aGuard( m_aMutex ); + + //see SvxRectCtl::Paint + const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings(); + return sal_Int32(rStyles.GetLabelTextColor()); +} + +sal_Int32 RectCtlAccessibleContext::getBackground( ) +{ + ::SolarMutexGuard aSolarGuard; + ::osl::MutexGuard aGuard( m_aMutex ); + + //see SvxRectCtl::Paint + const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings(); + return sal_Int32(rStyles.GetDialogColor()); +} + +// XAccessibleSelection +void RectCtlAccessibleContext::implSelect(sal_Int32 nIndex, bool bSelect) +{ + ::SolarMutexGuard aSolarGuard; + + ::osl::MutexGuard aGuard( m_aMutex ); + + checkChildIndex( nIndex ); + + const ChildIndexToPointData* pData = IndexToPoint( nIndex ); + + DBG_ASSERT(pData, "RectCtlAccessibleContext::selectAccessibleChild(): this is an impossible state! Or at least should be..."); + + if (mpRepr) + { + if (bSelect) + { + // this does all what is needed, including the change of the child's state! + mpRepr->SetActualRP( pData->ePoint ); + } + else + { + SAL_WARN( "svx", "RectCtlAccessibleContext::clearAccessibleSelection() is not possible!" ); + } + } +} + +bool RectCtlAccessibleContext::implIsSelected( sal_Int32 nIndex ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + checkChildIndex( nIndex ); + + return nIndex == mnSelectedChild; +} + +// internals +void RectCtlAccessibleContext::checkChildIndex( long nIndex ) +{ + if( nIndex < 0 || nIndex >= getAccessibleChildCount() ) + throw lang::IndexOutOfBoundsException(); +} + +void RectCtlAccessibleContext::FireChildFocus( RectPoint eButton ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + long nNew = PointToIndex( eButton ); + long nNumOfChildren = getAccessibleChildCount(); + if( nNew < nNumOfChildren ) + { + // select new child + mnSelectedChild = nNew; + if( nNew != NOCHILDSELECTED ) + { + if( mvChildren[ nNew ].is() ) + mvChildren[ nNew ]->FireFocusEvent(); + } + else + { + Any aOld; + Any aNew; + aNew <<= AccessibleStateType::FOCUSED; + NotifyAccessibleEvent(AccessibleEventId::STATE_CHANGED, aNew, aOld); + } + } + else + mnSelectedChild = NOCHILDSELECTED; +} + +void RectCtlAccessibleContext::selectChild( long nNew ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + if( nNew != mnSelectedChild ) + { + long nNumOfChildren = getAccessibleChildCount(); + if( nNew < nNumOfChildren ) + { // valid index + RectCtlChildAccessibleContext* pChild; + if( mnSelectedChild != NOCHILDSELECTED ) + { // deselect old selected child if one is selected + pChild = mvChildren[ mnSelectedChild ].get(); + if( pChild ) + pChild->setStateChecked( false ); + } + + // select new child + mnSelectedChild = nNew; + + if( nNew != NOCHILDSELECTED ) + { + if( mvChildren[ nNew ].is() ) + mvChildren[ nNew ]->setStateChecked( true ); + } + } + else + mnSelectedChild = NOCHILDSELECTED; + } +} + +void RectCtlAccessibleContext::selectChild(RectPoint eButton ) +{ + // no guard -> is done in next selectChild + selectChild(PointToIndex( eButton )); +} + +void SAL_CALL RectCtlAccessibleContext::disposing() +{ + ::osl::MutexGuard aGuard(m_aMutex); + OAccessibleSelectionHelper::disposing(); + for (auto & rxChild : mvChildren) + { + if( rxChild.is() ) + rxChild->dispose(); + } + mvChildren.clear(); + mpRepr = nullptr; +} + +awt::Rectangle RectCtlAccessibleContext::implGetBounds() +{ + ::SolarMutexGuard aSolarGuard; + ::osl::MutexGuard aGuard( m_aMutex ); + + awt::Rectangle aRet; + + if (mpRepr) + { + const Point aOutPos;//( mpRepr->GetPosPixel() ); + Size aOutSize( mpRepr->GetSize()); + + aRet.X = aOutPos.X(); + aRet.Y = aOutPos.Y(); + aRet.Width = aOutSize.Width(); + aRet.Height = aOutSize.Height(); + } + + return aRet; +} SvxRectCtlChildAccessibleContext::SvxRectCtlChildAccessibleContext( const Reference<XAccessible>& rxParent, @@ -1022,4 +1324,244 @@ void SvxRectCtlChildAccessibleContext::FireFocusEvent() CommitChange( AccessibleEventObject( xSource, AccessibleEventId::STATE_CHANGED, aNew, aOld ) ); } +RectCtlChildAccessibleContext::RectCtlChildAccessibleContext( + const Reference<XAccessible>& rxParent, + const OUString& rName, + const OUString& rDescription, + const tools::Rectangle& rBoundingBox, + long nIndexInParent ) + : msDescription( rDescription ) + , msName( rName ) + , mxParent(rxParent) + , maBoundingBox( rBoundingBox ) + , mnIndexInParent( nIndexInParent ) + , mbIsChecked( false ) +{ +} + +RectCtlChildAccessibleContext::~RectCtlChildAccessibleContext() +{ + ensureDisposed(); +} + +Reference< XAccessible > SAL_CALL RectCtlChildAccessibleContext::getAccessibleAtPoint( const awt::Point& /*rPoint*/ ) +{ + return Reference< XAccessible >(); +} + +void SAL_CALL RectCtlChildAccessibleContext::grabFocus() +{ +} + +sal_Int32 RectCtlChildAccessibleContext::getForeground( ) +{ + ::SolarMutexGuard aSolarGuard; + ::osl::MutexGuard aGuard( m_aMutex ); + + //see SvxRectCtl::Paint + const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings(); + return sal_Int32(rStyles.GetLabelTextColor()); +} + +sal_Int32 RectCtlChildAccessibleContext::getBackground( ) +{ + ::SolarMutexGuard aSolarGuard; + ::osl::MutexGuard aGuard( m_aMutex ); + + //see SvxRectCtl::Paint + const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings(); + return sal_Int32(rStyles.GetDialogColor()); +} + +// XAccessibleContext +sal_Int32 SAL_CALL RectCtlChildAccessibleContext::getAccessibleChildCount() +{ + return 0; +} + +Reference< XAccessible > SAL_CALL RectCtlChildAccessibleContext::getAccessibleChild( sal_Int32 /*nIndex*/ ) +{ + throw lang::IndexOutOfBoundsException(); +} + +Reference< XAccessible > SAL_CALL RectCtlChildAccessibleContext::getAccessibleParent() +{ + return mxParent; +} + +sal_Int16 SAL_CALL RectCtlChildAccessibleContext::getAccessibleRole() +{ + return AccessibleRole::RADIO_BUTTON; +} + +OUString SAL_CALL RectCtlChildAccessibleContext::getAccessibleDescription() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + return msDescription; +} + +OUString SAL_CALL RectCtlChildAccessibleContext::getAccessibleName() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + return msName; +} + +/** Return empty reference to indicate that the relation set is not + supported. +*/ +Reference<XAccessibleRelationSet> SAL_CALL RectCtlChildAccessibleContext::getAccessibleRelationSet() +{ + utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper; + uno::Reference< css::accessibility::XAccessibleRelationSet > xSet = pRelationSetHelper; + if( mxParent.is() ) + { + uno::Sequence< uno::Reference< uno::XInterface > > aSequence { mxParent }; + pRelationSetHelper->AddRelation( css::accessibility::AccessibleRelation( css::accessibility::AccessibleRelationType::MEMBER_OF, aSequence ) ); + + } + + return xSet; +} + +Reference< XAccessibleStateSet > SAL_CALL RectCtlChildAccessibleContext::getAccessibleStateSet() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper; + + if (!rBHelper.bDisposed) + { + if( mbIsChecked ) + { + pStateSetHelper->AddState( AccessibleStateType::CHECKED ); + } + + pStateSetHelper->AddState( AccessibleStateType::ENABLED ); + pStateSetHelper->AddState( AccessibleStateType::SENSITIVE ); + pStateSetHelper->AddState( AccessibleStateType::OPAQUE ); + pStateSetHelper->AddState( AccessibleStateType::SELECTABLE ); + pStateSetHelper->AddState( AccessibleStateType::SHOWING ); + pStateSetHelper->AddState( AccessibleStateType::VISIBLE ); + } + else + pStateSetHelper->AddState( AccessibleStateType::DEFUNC ); + + return pStateSetHelper; +} + +// XAccessibleValue +Any SAL_CALL RectCtlChildAccessibleContext::getCurrentValue() +{ + Any aRet; + aRet <<= ( mbIsChecked? 1.0 : 0.0 ); + return aRet; +} + +sal_Bool SAL_CALL RectCtlChildAccessibleContext::setCurrentValue( const Any& /*aNumber*/ ) +{ + return false; +} + +Any SAL_CALL RectCtlChildAccessibleContext::getMaximumValue() +{ + Any aRet; + aRet <<= 1.0; + return aRet; +} + +Any SAL_CALL RectCtlChildAccessibleContext::getMinimumValue() +{ + Any aRet; + aRet <<= 0.0; + return aRet; +} + + +// XAccessibleAction + + +sal_Int32 RectCtlChildAccessibleContext::getAccessibleActionCount( ) +{ + return 1; +} + + +sal_Bool RectCtlChildAccessibleContext::doAccessibleAction ( sal_Int32 nIndex ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) + throw IndexOutOfBoundsException(); + + Reference<XAccessibleSelection> xSelection( mxParent, UNO_QUERY); + + xSelection->selectAccessibleChild(mnIndexInParent); + + return true; +} + + +OUString RectCtlChildAccessibleContext::getAccessibleActionDescription ( sal_Int32 nIndex ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) + throw IndexOutOfBoundsException(); + + return OUString("select"); +} + + +Reference< XAccessibleKeyBinding > RectCtlChildAccessibleContext::getAccessibleActionKeyBinding( sal_Int32 nIndex ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) + throw IndexOutOfBoundsException(); + + return Reference< XAccessibleKeyBinding >(); +} + +void SAL_CALL RectCtlChildAccessibleContext::disposing() +{ + OAccessibleComponentHelper::disposing(); + mxParent.clear(); +} + +awt::Rectangle RectCtlChildAccessibleContext::implGetBounds( ) +{ + // no guard necessary, because no one changes maBoundingBox after creating it + return AWTRectangle(maBoundingBox); +} + +void RectCtlChildAccessibleContext::setStateChecked( bool bChecked ) +{ + if( mbIsChecked != bChecked ) + { + mbIsChecked = bChecked; + + Any aOld; + Any aNew; + Any& rMod = bChecked? aNew : aOld; + + //Send the STATE_CHANGED(Focused) event to accessible + rMod <<= AccessibleStateType::FOCUSED; + NotifyAccessibleEvent(AccessibleEventId::STATE_CHANGED, aNew, aOld); + + rMod <<= AccessibleStateType::CHECKED; + + NotifyAccessibleEvent(AccessibleEventId::STATE_CHANGED, aNew, aOld); + } +} + +void RectCtlChildAccessibleContext::FireFocusEvent() +{ + Any aOld; + Any aNew; + aNew <<= AccessibleStateType::FOCUSED; + NotifyAccessibleEvent(AccessibleEventId::STATE_CHANGED, aNew, aOld); +} + +IMPLEMENT_FORWARD_XINTERFACE2( RectCtlChildAccessibleContext, OAccessibleComponentHelper, OAccessibleHelper_Base_3 ) +IMPLEMENT_FORWARD_XTYPEPROVIDER2( RectCtlChildAccessibleContext, OAccessibleComponentHelper, OAccessibleHelper_Base_3 ) + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/dialog/dlgctrl.cxx b/svx/source/dialog/dlgctrl.cxx index 7e2ffb67c0e3..a4d31925d242 100644 --- a/svx/source/dialog/dlgctrl.cxx +++ b/svx/source/dialog/dlgctrl.cxx @@ -353,7 +353,6 @@ void SvxRectCtl::DataChanged( const DataChangedEvent& rDCEvt ) } // the control (rectangle with 9 circles) - void SvxRectCtl::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) { InitSettings(rRenderContext); @@ -660,6 +659,526 @@ void SvxRectCtl::DoCompletelyDisable(bool bNew) Invalidate(); } +BitmapEx& RectCtl::GetRectBitmap() +{ + if( !pBitmap ) + InitRectBitmap(); + + return *pBitmap; +} + +RectCtl::RectCtl(weld::Builder& rBuilder, const OString& rDrawingId, SvxTabPage* pPage, RectPoint eRpt, sal_uInt16 nBorder, sal_uInt16 nCircle) + : m_pPage(pPage) + , nBorderWidth(Application::GetDefaultDevice()->LogicToPixel(Size(nBorder, 0), MapMode(MapUnit::Map100thMM)).Width()) + , nRadius(Application::GetDefaultDevice()->LogicToPixel(Size(nCircle, 0), MapMode(MapUnit::Map100thMM)).Width()) + , eDefRP(eRpt) + , pBitmap(nullptr) + , m_nState(CTL_STATE::NONE) + , mbCompleteDisable(false) +{ + m_xControl.reset(rBuilder.weld_drawing_area(rDrawingId, CreateAccessible())); + m_xControl->connect_style_updated(LINK(this, RectCtl, MarkToResetSettings)); + m_xControl->connect_draw(LINK(this, RectCtl, DoPaint)); + m_xControl->connect_size_allocate(LINK(this, RectCtl, DoResize)); + m_xControl->connect_mouse_press(LINK(this, RectCtl, DoMouseButtonDown)); + m_xControl->connect_key_press(LINK(this, RectCtl, DoKeyDown)); + m_xControl->connect_focus_in(LINK(this, RectCtl, DoGetFocus)); + m_xControl->connect_focus_out(LINK(this, RectCtl, DoLoseFocus)); + + m_xControl->set_size_request(m_xControl->get_approximate_digit_width() * 25, m_xControl->get_text_height() * 5); + Resize_Impl(); +} + +void RectCtl::SetControlSettings(RectPoint eRpt, sal_uInt16 nBorder, sal_uInt16 nCircle) +{ + nBorderWidth = Application::GetDefaultDevice()->LogicToPixel(Size(nBorder, 0), MapMode(MapUnit::Map100thMM)).Width(); + nRadius = Application::GetDefaultDevice()->LogicToPixel(Size(nCircle, 0), MapMode(MapUnit::Map100thMM)).Width(); + eDefRP = eRpt; + Resize_Impl(); +} + +RectCtl::~RectCtl() +{ + delete pBitmap; + + pAccContext.clear(); +} + +IMPL_LINK(RectCtl, DoResize, const Size&, rSize, void) +{ + m_aSize = rSize; + Resize_Impl(); +} + +void RectCtl::Resize_Impl() +{ + aPtLT = Point( 0 + nBorderWidth, 0 + nBorderWidth ); + aPtMT = Point( m_aSize.Width() / 2, 0 + nBorderWidth ); + aPtRT = Point( m_aSize.Width() - nBorderWidth, 0 + nBorderWidth ); + + aPtLM = Point( 0 + nBorderWidth, m_aSize.Height() / 2 ); + aPtMM = Point( m_aSize.Width() / 2, m_aSize.Height() / 2 ); + aPtRM = Point( m_aSize.Width() - nBorderWidth, m_aSize.Height() / 2 ); + + aPtLB = Point( 0 + nBorderWidth, m_aSize.Height() - nBorderWidth ); + aPtMB = Point( m_aSize.Width() / 2, m_aSize.Height() - nBorderWidth ); + aPtRB = Point( m_aSize.Width() - nBorderWidth, m_aSize.Height() - nBorderWidth ); + + Reset(); + MarkToResetSettings(*m_xControl); + m_xControl->queue_draw(); +} + +void RectCtl::InitRectBitmap() +{ + delete pBitmap; + + const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings(); + svtools::ColorConfig aColorConfig; + + pBitmap = new BitmapEx(RID_SVXCTRL_RECTBTNS); + + // set bitmap-colors + Color aColorAry1[7]; + Color aColorAry2[7]; + aColorAry1[0] = Color( 0xC0, 0xC0, 0xC0 ); // light-gray + aColorAry1[1] = Color( 0xFF, 0xFF, 0x00 ); // yellow + aColorAry1[2] = Color( 0xFF, 0xFF, 0xFF ); // white + aColorAry1[3] = Color( 0x80, 0x80, 0x80 ); // dark-gray + aColorAry1[4] = Color( 0x00, 0x00, 0x00 ); // black + aColorAry1[5] = Color( 0x00, 0xFF, 0x00 ); // green + aColorAry1[6] = Color( 0x00, 0x00, 0xFF ); // blue + aColorAry2[0] = rStyles.GetDialogColor(); // background + aColorAry2[1] = rStyles.GetWindowColor(); + aColorAry2[2] = rStyles.GetLightColor(); + aColorAry2[3] = rStyles.GetShadowColor(); + aColorAry2[4] = rStyles.GetDarkShadowColor(); + aColorAry2[5] = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor; + aColorAry2[6] = rStyles.GetDialogColor(); + +#ifdef DBG_UTIL + static bool bModify = false; + bool& rModify = bModify; + if( rModify ) + { + static int n = 0; + static sal_uInt8 r = 0xFF; + static sal_uInt8 g = 0x00; + static sal_uInt8 b = 0xFF; + int& rn = n; + sal_uInt8& rr = r; + sal_uInt8& rg = g; + sal_uInt8& rb = b; + aColorAry2[ rn ] = Color( rr, rg, rb ); + } +#endif + + pBitmap->Replace( aColorAry1, aColorAry2, 7 ); +} + +IMPL_LINK_NOARG(RectCtl, MarkToResetSettings, weld::Widget&, void) +{ + delete pBitmap; + pBitmap = nullptr; // forces new creating of bitmap +} + +void RectCtl::InitSettings(vcl::RenderContext& rRenderContext) +{ + svtools::ColorConfig aColorConfig; + Color aTextColor(aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor); + rRenderContext.SetTextColor(aTextColor); + const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); + rRenderContext.SetBackground(rStyleSettings.GetWindowColor()); +} + +// The clicked rectangle (3 x 3) is determined and the parent (dialog) +// is notified that the item was changed +IMPL_LINK(RectCtl, DoMouseButtonDown, const MouseEvent&, rMEvt, void) +{ + // CompletelyDisabled() added to have a disabled state for RectCtl + if(!IsCompletelyDisabled()) + { + aPtNew = GetApproxLogPtFromPixPt( rMEvt.GetPosPixel() ); + eRP = GetRPFromPoint( aPtNew ); + SetActualRP( eRP ); + + if (m_pPage) + m_pPage->PointChanged(m_xControl.get(), eRP); + } +} + +IMPL_LINK(RectCtl, DoKeyDown, const KeyEvent&, rKeyEvt, bool) +{ + // CompletelyDisabled() added to have a disabled state for RectCtl + if (IsCompletelyDisabled()) + return false; + + RectPoint eNewRP = eRP; + + switch( rKeyEvt.GetKeyCode().GetCode() ) + { + case KEY_DOWN: + { + if( !(m_nState & CTL_STATE::NOVERT) ) + switch( eNewRP ) + { + case RectPoint::LT: eNewRP = RectPoint::LM; break; + case RectPoint::MT: eNewRP = RectPoint::MM; break; + case RectPoint::RT: eNewRP = RectPoint::RM; break; + case RectPoint::LM: eNewRP = RectPoint::LB; break; + case RectPoint::MM: eNewRP = RectPoint::MB; break; + case RectPoint::RM: eNewRP = RectPoint::RB; break; + default: ; //prevent warning + } + } + break; + case KEY_UP: + { + if( !(m_nState & CTL_STATE::NOVERT) ) + switch( eNewRP ) + { + case RectPoint::LM: eNewRP = RectPoint::LT; break; + case RectPoint::MM: eNewRP = RectPoint::MT; break; + case RectPoint::RM: eNewRP = RectPoint::RT; break; + case RectPoint::LB: eNewRP = RectPoint::LM; break; + case RectPoint::MB: eNewRP = RectPoint::MM; break; + case RectPoint::RB: eNewRP = RectPoint::RM; break; + default: ; //prevent warning + } + } + break; + case KEY_LEFT: + { + if( !(m_nState & CTL_STATE::NOHORZ) ) + switch( eNewRP ) + { + case RectPoint::MT: eNewRP = RectPoint::LT; break; + case RectPoint::RT: eNewRP = RectPoint::MT; break; + case RectPoint::MM: eNewRP = RectPoint::LM; break; + case RectPoint::RM: eNewRP = RectPoint::MM; break; + case RectPoint::MB: eNewRP = RectPoint::LB; break; + case RectPoint::RB: eNewRP = RectPoint::MB; break; + default: ; //prevent warning + } + } + break; + case KEY_RIGHT: + { + if( !(m_nState & CTL_STATE::NOHORZ) ) + switch( eNewRP ) + { + case RectPoint::LT: eNewRP = RectPoint::MT; break; + case RectPoint::MT: eNewRP = RectPoint::RT; break; + case RectPoint::LM: eNewRP = RectPoint::MM; break; + case RectPoint::MM: eNewRP = RectPoint::RM; break; + case RectPoint::LB: eNewRP = RectPoint::MB; break; + case RectPoint::MB: eNewRP = RectPoint::RB; break; + default: ; //prevent warning + } + } + break; + default: + return false; + } + if( eNewRP != eRP ) + { + SetActualRP( eNewRP ); + + if (m_pPage) + m_pPage->PointChanged(m_xControl.get(), eRP); + } + return true; +} + +// the control (rectangle with 9 circles) +IMPL_LINK(RectCtl, DoPaint, weld::DrawingArea::draw_args, aPayload, void) +{ + vcl::RenderContext& rRenderContext = aPayload.first; + + InitSettings(rRenderContext); + + Point aPtDiff(1, 1); + + const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings(); + + rRenderContext.SetLineColor(rStyles.GetDialogColor()); + rRenderContext.SetFillColor(rStyles.GetDialogColor()); + rRenderContext.DrawRect(tools::Rectangle(Point(0,0), rRenderContext.GetOutputSize())); + + if (m_xControl->get_sensitive()) + rRenderContext.SetLineColor(rStyles.GetLabelTextColor()); + else + rRenderContext.SetLineColor(rStyles.GetShadowColor()); + + rRenderContext.SetFillColor(); + + if (!m_xControl->get_sensitive()) + { + Color aOldCol = rRenderContext.GetLineColor(); + rRenderContext.SetLineColor(rStyles.GetLightColor()); + rRenderContext.DrawRect(tools::Rectangle(aPtLT + aPtDiff, aPtRB + aPtDiff)); + rRenderContext.SetLineColor(aOldCol); + } + rRenderContext.DrawRect(tools::Rectangle(aPtLT, aPtRB)); + + rRenderContext.SetFillColor(rRenderContext.GetBackground().GetColor()); + + Size aBtnSize(11, 11); + Size aDstBtnSize(aBtnSize); + Point aToCenter(aDstBtnSize.Width() >> 1, aDstBtnSize.Height() >> 1); + Point aBtnPnt1(m_xControl->get_sensitive() ? 0 : 22, 0); + Point aBtnPnt2(11, 0); + Point aBtnPnt3(22, 0); + + bool bNoHorz = bool(m_nState & CTL_STATE::NOHORZ); + bool bNoVert = bool(m_nState & CTL_STATE::NOVERT); + + BitmapEx& rBitmap = GetRectBitmap(); + + // CompletelyDisabled() added to have a disabled state for SvxRectCtl + if (IsCompletelyDisabled()) + { + rRenderContext.DrawBitmap(aPtLT - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtMT - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtRT - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtLM - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtMM - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtRM - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtLB - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtMB - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtRB - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap.GetBitmap()); + } + else + { + rRenderContext.DrawBitmap(aPtLT - aToCenter, aDstBtnSize, (bNoHorz || bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtMT - aToCenter, aDstBtnSize, bNoVert?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtRT - aToCenter, aDstBtnSize, (bNoHorz || bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtLM - aToCenter, aDstBtnSize, bNoHorz?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap.GetBitmap()); + + // Center for rectangle and line + rRenderContext.DrawBitmap(aPtMM - aToCenter, aDstBtnSize, aBtnPnt1, aBtnSize, rBitmap.GetBitmap()); + + rRenderContext.DrawBitmap(aPtRM - aToCenter, aDstBtnSize, bNoHorz?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtLB - aToCenter, aDstBtnSize, (bNoHorz || bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtMB - aToCenter, aDstBtnSize, bNoVert?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap.GetBitmap()); + rRenderContext.DrawBitmap(aPtRB - aToCenter, aDstBtnSize, (bNoHorz || bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap.GetBitmap()); + } + + // draw active button, avoid center pos for angle + // CompletelyDisabled() added to have a disabled state for SvxRectCtl + if (!IsCompletelyDisabled()) + { + if (m_xControl->get_sensitive()) + { + Point aCenterPt(aPtNew); + aCenterPt -= aToCenter; + + rRenderContext.DrawBitmap(aCenterPt, aDstBtnSize, aBtnPnt2, aBtnSize, rBitmap.GetBitmap()); + } + } + + if (m_xControl->has_focus()) + { + tools::Rectangle aFocusRect(CalculateFocusRectangle()); + rRenderContext.Invert(aFocusRect, InvertFlags(0xffff)); + } +} + +// Convert RectPoint Point + +const Point& RectCtl::GetPointFromRP( RectPoint _eRP) const +{ + switch( _eRP ) + { + case RectPoint::LT: return aPtLT; + case RectPoint::MT: return aPtMT; + case RectPoint::RT: return aPtRT; + case RectPoint::LM: return aPtLM; + case RectPoint::MM: return aPtMM; + case RectPoint::RM: return aPtRM; + case RectPoint::LB: return aPtLB; + case RectPoint::MB: return aPtMB; + case RectPoint::RB: return aPtRB; + } + return aPtMM; // default +} + +Point RectCtl::SetActualRPWithoutInvalidate( RectPoint eNewRP ) +{ + Point aPtLast = aPtNew; + aPtNew = GetPointFromRP( eNewRP ); + + if( m_nState & CTL_STATE::NOHORZ ) + aPtNew.setX( aPtMM.X() ); + + if( m_nState & CTL_STATE::NOVERT ) + aPtNew.setY( aPtMM.Y() ); + + // fdo#74751 this fix reverse base point on RTL UI. + bool bRTL = AllSettings::GetLayoutRTL(); + eNewRP = GetRPFromPoint( aPtNew, bRTL ); + + eDefRP = eNewRP; + eRP = eNewRP; + + return aPtLast; +} + +IMPL_LINK_NOARG(RectCtl, DoGetFocus, weld::Widget&, void) +{ + m_xControl->queue_draw(); + + // Send accessibility event. + if (pAccContext.is()) + { + pAccContext->FireChildFocus(GetActualRP()); + } +} + +IMPL_LINK_NOARG(RectCtl, DoLoseFocus, weld::Widget&, void) +{ + m_xControl->queue_draw(); +} + +Point RectCtl::GetApproxLogPtFromPixPt( const Point& rPt ) const +{ + Point aPt = rPt; + long x; + long y; + + if( !( m_nState & CTL_STATE::NOHORZ ) ) + { + if( aPt.X() < m_aSize.Width() / 3 ) + x = aPtLT.X(); + else if( aPt.X() < m_aSize.Width() * 2 / 3 ) + x = aPtMM.X(); + else + x = aPtRB.X(); + } + else + x = aPtMM.X(); + + if( !( m_nState & CTL_STATE::NOVERT ) ) + { + if( aPt.Y() < m_aSize.Height() / 3 ) + y = aPtLT.Y(); + else if( aPt.Y() < m_aSize.Height() * 2 / 3 ) + y = aPtMM.Y(); + else + y = aPtRB.Y(); + } + else + y = aPtMM.Y(); + + return Point( x, y ); +} + + +// Converts Point in RectPoint + +RectPoint RectCtl::GetRPFromPoint( Point aPt, bool bRTL ) const +{ + RectPoint rPoint = RectPoint::MM; // default + + if (aPt == aPtLT) rPoint = bRTL ? RectPoint::RT : RectPoint::LT; + else if( aPt == aPtMT) rPoint = RectPoint::MT; + else if( aPt == aPtRT) rPoint = bRTL ? RectPoint::LT : RectPoint::RT; + else if( aPt == aPtLM) rPoint = bRTL ? RectPoint::RM : RectPoint::LM; + else if( aPt == aPtRM) rPoint = bRTL ? RectPoint::LM : RectPoint::RM; + else if( aPt == aPtLB) rPoint = bRTL ? RectPoint::RB : RectPoint::LB; + else if( aPt == aPtMB) rPoint = RectPoint::MB; + else if( aPt == aPtRB) rPoint = bRTL ? RectPoint::LB : RectPoint::RB; + + return rPoint; +} + +// Resets to the original state of the control + +void RectCtl::Reset() +{ + aPtNew = GetPointFromRP( eDefRP ); + eRP = eDefRP; + m_xControl->queue_draw(); +} + +// Returns the currently selected RectPoint + + +void RectCtl::SetActualRP( RectPoint eNewRP ) +{ + SetActualRPWithoutInvalidate(eNewRP); + + m_xControl->queue_draw(); + + // notify accessibility object about change + if (pAccContext.is()) + pAccContext->selectChild( eNewRP /* MT, bFireFocus */ ); +} + +void RectCtl::SetState( CTL_STATE nState ) +{ + m_nState = nState; + + Point aPtLast( GetPointFromRP( eRP ) ); + Point _aPtNew( aPtLast ); + + if( m_nState & CTL_STATE::NOHORZ ) + _aPtNew.setX( aPtMM.X() ); + + if( m_nState & CTL_STATE::NOVERT) + _aPtNew.setY( aPtMM.Y() ); + + eRP = GetRPFromPoint( _aPtNew ); + m_xControl->queue_draw(); + + if (m_pPage) + m_pPage->PointChanged(m_xControl.get(), eRP); +} + +tools::Rectangle RectCtl::CalculateFocusRectangle() const +{ + Size aDstBtnSize(15, 15); + return tools::Rectangle( aPtNew - Point( aDstBtnSize.Width() >> 1, aDstBtnSize.Height() >> 1 ), aDstBtnSize ); +} + +tools::Rectangle RectCtl::CalculateFocusRectangle( RectPoint eRectPoint ) const +{ + tools::Rectangle aRet; + RectPoint eOldRectPoint = GetActualRP(); + + if( eOldRectPoint == eRectPoint ) + aRet = CalculateFocusRectangle(); + else + { + RectCtl* pThis = const_cast<RectCtl*>(this); + + pThis->SetActualRPWithoutInvalidate( eRectPoint ); // no invalidation because it's only temporary! + aRet = CalculateFocusRectangle(); + + pThis->SetActualRPWithoutInvalidate( eOldRectPoint ); // no invalidation because nothing has changed! + } + + return aRet; +} + +Reference< XAccessible > RectCtl::CreateAccessible() +{ + pAccContext = new RectCtlAccessibleContext(this); + return pAccContext.get(); +} + +RectPoint RectCtl::GetApproxRPFromPixPt( const css::awt::Point& r ) const +{ + return GetRPFromPoint( GetApproxLogPtFromPixPt( Point( r.X, r.Y ) ) ); +} + +// CompletelyDisabled() added to have a disabled state for RectCtl +void RectCtl::DoCompletelyDisable(bool bNew) +{ + mbCompleteDisable = bNew; + m_xControl->queue_draw(); +} + // Control for editing bitmaps css::uno::Reference< css::accessibility::XAccessible > SvxPixelCtl::CreateAccessible() diff --git a/svx/source/inc/charmapacc.hxx b/svx/source/inc/charmapacc.hxx index 346add7aec3b..d594f390495e 100644 --- a/svx/source/inc/charmapacc.hxx +++ b/svx/source/inc/charmapacc.hxx @@ -85,7 +85,6 @@ namespace svx //OAccessibleContextHelper // XAccessibleContext - still waiting to be overwritten - virtual sal_Int32 SAL_CALL getAccessibleIndexInParent() override; virtual sal_Int32 SAL_CALL getAccessibleChildCount() override; virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) override; virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) override; diff --git a/svx/source/inc/svxrectctaccessiblecontext.hxx b/svx/source/inc/svxrectctaccessiblecontext.hxx index 35e11bef8684..347e7f4c82ad 100644 --- a/svx/source/inc/svxrectctaccessiblecontext.hxx +++ b/svx/source/inc/svxrectctaccessiblecontext.hxx @@ -41,7 +41,9 @@ #include <cppuhelper/interfacecontainer.h> #include <cppuhelper/compbase6.hxx> #include <cppuhelper/compbase7.hxx> +#include <cppuhelper/compbase3.hxx> #include <cppuhelper/basemutex.hxx> +#include <comphelper/accessibleselectionhelper.hxx> #include <comphelper/servicehelper.hxx> #include <svx/rectenum.hxx> #include <vcl/vclptr.hxx> @@ -56,11 +58,12 @@ namespace com { namespace sun { namespace star { namespace awt { } } } } namespace tools { class Rectangle; } +class RectCtl; class SvxRectCtl; +class RectCtlChildAccessibleContext; class SvxRectCtlChildAccessibleContext; namespace vcl { class Window; } - typedef ::cppu::WeakAggComponentImplHelper6< css::accessibility::XAccessible, css::accessibility::XAccessibleComponent, @@ -230,7 +233,10 @@ private: virtual void SAL_CALL disposing() override; /// @returns true if it's disposed or in disposing - inline bool IsAlive() const; + bool IsAlive() const + { + return !rBHelper.bDisposed && !rBHelper.bInDispose; + } /// @throws css::lang::DisposedException if it's not alive void ThrowExceptionIfNotAlive(); @@ -261,10 +267,93 @@ private: long mnSelectedChild; }; -inline bool SvxRectCtlAccessibleContext::IsAlive() const +typedef ::cppu::ImplHelper1<css::accessibility::XAccessible> OAccessibleHelper_Base; + +class RectCtlAccessibleContext final : public ::comphelper::OAccessibleSelectionHelper, + public OAccessibleHelper_Base { - return !rBHelper.bDisposed && !rBHelper.bInDispose; -} +public: + // internal + RectCtlAccessibleContext(RectCtl* pRepresentation); + + DECLARE_XINTERFACE( ) + DECLARE_XTYPEPROVIDER( ) + + // XAccessibleComponent + virtual void SAL_CALL grabFocus() override; + virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint(const css::awt::Point& rPoint) override; + + // XAccessible + // XAccessibleContext + virtual sal_Int32 SAL_CALL getAccessibleChildCount() override; + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL getAccessibleChild(sal_Int32 nIndex) override; + virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL getAccessibleParent() override; + virtual sal_Int16 SAL_CALL getAccessibleRole() override; + virtual OUString SAL_CALL getAccessibleDescription() override; + virtual OUString SAL_CALL getAccessibleName() override; + virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet() override; + virtual css::uno::Reference< css::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet() override; + + virtual css::uno::Reference< css::accessibility::XAccessibleContext> SAL_CALL getAccessibleContext() override { return this; } + virtual sal_Int32 SAL_CALL getForeground() override; + virtual sal_Int32 SAL_CALL getBackground() override; + + /** Selects a new child by point. + + <p>If the child was not selected before, the state of the child will + be updated. If the point is not invalid, the index will internally set to NOCHILDSELECTED</p> + + @param eButton + Button which belongs to the child which should be selected. + */ + void selectChild( RectPoint ePoint ); + void FireChildFocus( RectPoint eButton ); + +private: + virtual ~RectCtlAccessibleContext() override; + + // OCommonAccessibleSelection + // return if the specified child is visible => watch for special ChildIndexes (ACCESSIBLE_SELECTION_CHILD_xxx) + virtual bool implIsSelected(sal_Int32 nAccessibleChildIndex) override; + + // select the specified child => watch for special ChildIndexes (ACCESSIBLE_SELECTION_CHILD_xxx) + virtual void implSelect(sal_Int32 nAccessibleChildIndex, bool bSelect) override; + + // OCommonAccessibleComponent + virtual css::awt::Rectangle implGetBounds() override; + + virtual void SAL_CALL disposing() override; + + void checkChildIndex(long nIndex); + + /** Selects a new child by index. + + <p>If the child was not selected before, the state of the child will + be updated. If the index is invalid, the index will internally set to NOCHILDSELECTED</p> + + @param nIndexOfChild + Index of the new child which should be selected. + */ + void selectChild( long nIndexOfChild ); + + /** Description of this object. This is not a constant because it can + be set from the outside. + */ + OUString msDescription; + + /** Name of this object. + */ + OUString msName; + + /// pointer to internal representation + RectCtl* mpRepr; + + /// array for all possible children + std::vector<rtl::Reference<RectCtlChildAccessibleContext>> mvChildren; + + /// actual selected child + long mnSelectedChild; +}; typedef ::cppu::WeakAggComponentImplHelper7< css::accessibility::XAccessible, @@ -408,7 +497,10 @@ protected: virtual void SAL_CALL disposing() override; /// @returns true if it's disposed or in disposing - inline bool IsAlive() const; + bool IsAlive() const + { + return !rBHelper.bDisposed && !rBHelper.bInDispose; + } /// @throws css::lang::DisposedException if it's not alive void ThrowExceptionIfNotAlive(); @@ -449,10 +541,103 @@ private: bool mbIsChecked; }; -inline bool SvxRectCtlChildAccessibleContext::IsAlive() const +typedef ::cppu::ImplHelper3 < css::accessibility::XAccessible, + css::accessibility::XAccessibleValue, + css::accessibility::XAccessibleAction + > OAccessibleHelper_Base_3; + +class RectCtlChildAccessibleContext : public ::comphelper::OAccessibleComponentHelper, + public OAccessibleHelper_Base_3 { - return !rBHelper.bDisposed && !rBHelper.bInDispose; -} +public: + RectCtlChildAccessibleContext( + const css::uno::Reference< css::accessibility::XAccessible>& rxParent, + const OUString& rName, const OUString& rDescription, + const tools::Rectangle& rBoundingBox, + long nIndexInParent ); +protected: + virtual ~RectCtlChildAccessibleContext() override; + + // OCommonAccessibleComponent + /// implements the calculation of the bounding rectangle - still waiting to be overwritten + virtual css::awt::Rectangle implGetBounds( ) override; +public: + + DECLARE_XINTERFACE( ) + DECLARE_XTYPEPROVIDER( ) + + // XAccessibleComponent + virtual void SAL_CALL grabFocus() override; + virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const css::awt::Point& rPoint ) override; + + // XAccessibleContext + virtual sal_Int32 SAL_CALL getAccessibleChildCount() override; + virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 nIndex ) override; + virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent() override; + virtual sal_Int16 SAL_CALL getAccessibleRole() override; + virtual OUString SAL_CALL getAccessibleDescription() override; + virtual OUString SAL_CALL getAccessibleName() override; + virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet() override; + virtual css::uno::Reference< css::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet() override; + + virtual css::uno::Reference< css::accessibility::XAccessibleContext> SAL_CALL getAccessibleContext() override { return this; } + + virtual sal_Int32 SAL_CALL getForeground() override; + virtual sal_Int32 SAL_CALL getBackground() override; + + // XAccessibleValue + virtual css::uno::Any SAL_CALL + getCurrentValue() override; + + virtual sal_Bool SAL_CALL + setCurrentValue( const css::uno::Any& aNumber ) override; + + virtual css::uno::Any SAL_CALL + getMaximumValue() override; + + virtual css::uno::Any SAL_CALL + getMinimumValue() override; + + // XAccessibleAction + virtual sal_Int32 SAL_CALL getAccessibleActionCount( ) override; + virtual sal_Bool SAL_CALL doAccessibleAction ( sal_Int32 nIndex ) override; + virtual ::rtl::OUString SAL_CALL getAccessibleActionDescription ( sal_Int32 nIndex ) override; + virtual css::uno::Reference< css::accessibility::XAccessibleKeyBinding > SAL_CALL getAccessibleActionKeyBinding( sal_Int32 nIndex ) override; + + // internal + /// Sets the checked status + void setStateChecked(bool bChecked); + void FireFocusEvent(); + +protected: + virtual void SAL_CALL disposing() override; + +private: + + /** Description of this object. This is not a constant because it can + be set from the outside. Furthermore, it changes according to the + draw page's display mode. + */ + OUString msDescription; + + /** Name of this object. It changes according the draw page's + display mode. + */ + OUString msName; + + /// Reference to the parent object. + css::uno::Reference< css::accessibility::XAccessible > + mxParent; + + /// Bounding box + tools::Rectangle maBoundingBox; + + /// index of child in parent + long mnIndexInParent; + + /// Indicates, if object is checked + bool mbIsChecked; +}; #endif diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 3ec78eb95013..8af07394c310 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -18,6 +18,7 @@ */ #include <comphelper/lok.hxx> +#include <com/sun/star/accessibility/AccessibleRelationType.hpp> #include <salframe.hxx> #include <salinst.hxx> #include <salvd.hxx> @@ -30,6 +31,7 @@ #include <salmenu.hxx> #include <svdata.hxx> #include <messagedialog.hxx> +#include <unotools/accessiblerelationsethelper.hxx> #include <vcl/builder.hxx> #include <vcl/combobox.hxx> #include <vcl/lstbox.hxx> @@ -1604,6 +1606,7 @@ private: DECL_LINK(MouseReleaseHdl, const MouseEvent&, void); DECL_LINK(KeyPressHdl, const KeyEvent&, bool); DECL_LINK(KeyReleaseHdl, const KeyEvent&, bool); + DECL_LINK(StyleUpdatedHdl, VclDrawingArea&, void); public: SalInstanceDrawingArea(VclDrawingArea* pDrawingArea, const a11yref& rAlly, @@ -1620,6 +1623,7 @@ public: m_xDrawingArea->SetMouseReleaseHdl(LINK(this, SalInstanceDrawingArea, MouseReleaseHdl)); m_xDrawingArea->SetKeyPressHdl(LINK(this, SalInstanceDrawingArea, KeyPressHdl)); m_xDrawingArea->SetKeyReleaseHdl(LINK(this, SalInstanceDrawingArea, KeyReleaseHdl)); + m_xDrawingArea->SetStyleUpdatedHdl(LINK(this, SalInstanceDrawingArea, StyleUpdatedHdl)); } virtual void queue_draw() override @@ -1640,8 +1644,32 @@ public: return css::uno::Reference<css::accessibility::XAccessible>(); } + virtual a11yrelationset get_accessible_relation_set() override + { + utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper; + css::uno::Reference< css::accessibility::XAccessibleRelationSet > xSet = pRelationSetHelper; + vcl::Window* pWindow = m_xDrawingArea.get(); + if (pWindow) + { + vcl::Window *pLabeledBy = pWindow->GetAccessibleRelationLabeledBy(); + if (pLabeledBy && pLabeledBy != pWindow) + { + css::uno::Sequence<css::uno::Reference<css::uno::XInterface>> aSequence { pLabeledBy->GetAccessible() }; + pRelationSetHelper->AddRelation( css::accessibility::AccessibleRelation( css::accessibility::AccessibleRelationType::LABELED_BY, aSequence ) ); + } + vcl::Window* pMemberOf = pWindow->GetAccessibleRelationMemberOf(); + if (pMemberOf && pMemberOf != pWindow) + { + css::uno::Sequence<css::uno::Reference<css::uno::XInterface>> aSequence { pMemberOf->GetAccessible() }; + pRelationSetHelper->AddRelation( css::accessibility::AccessibleRelation( css::accessibility::AccessibleRelationType::MEMBER_OF, aSequence ) ); + } + } + return xSet; + } + virtual ~SalInstanceDrawingArea() override { + m_xDrawingArea->SetStyleUpdatedHdl(Link<VclDrawingArea&, void>()); m_xDrawingArea->SetMousePressHdl(Link<const MouseEvent&, void>()); m_xDrawingArea->SetMouseMoveHdl(Link<const MouseEvent&, void>()); m_xDrawingArea->SetMouseReleaseHdl(Link<const MouseEvent&, void>()); @@ -1687,6 +1715,11 @@ IMPL_LINK(SalInstanceDrawingArea, KeyReleaseHdl, const KeyEvent&, rEvent, bool) return m_aKeyReleaseHdl.Call(rEvent); } +IMPL_LINK_NOARG(SalInstanceDrawingArea, StyleUpdatedHdl, VclDrawingArea&, void) +{ + m_aStyleUpdatedHdl.Call(*this); +} + //ComboBox and ListBox have similar apis, ComboBoxes in LibreOffice have an edit box and ListBoxes //don't. This distinction isn't there in Gtk. Use a template to sort this problem out. template <class vcl_type> diff --git a/vcl/unx/gtk/a11y/atkwrapper.cxx b/vcl/unx/gtk/a11y/atkwrapper.cxx index 33ec9caabb14..baae426bc6d1 100644 --- a/vcl/unx/gtk/a11y/atkwrapper.cxx +++ b/vcl/unx/gtk/a11y/atkwrapper.cxx @@ -468,6 +468,11 @@ static gint wrapper_get_index_in_parent( AtkObject *atk_obj ) { AtkObjectWrapper *obj = ATK_OBJECT_WRAPPER (atk_obj); + + //if we're a native GtkDrawingArea with custom a11y, use the default toolkit index in parent + if (obj->mpOrig) + return atk_object_get_index_in_parent(obj->mpOrig); + gint i = -1; if( obj->mpContext.is() ) @@ -488,6 +493,11 @@ static AtkRelationSet * wrapper_ref_relation_set( AtkObject *atk_obj ) { AtkObjectWrapper *obj = ATK_OBJECT_WRAPPER (atk_obj); + + //if we're a native GtkDrawingArea with custom a11y, use the default toolkit relation set impl + if (obj->mpOrig) + return atk_object_ref_relation_set(obj->mpOrig); + AtkRelationSet *pSet = atk_relation_set_new(); if( obj->mpContext.is() ) @@ -797,7 +807,7 @@ atk_object_wrapper_ref( const uno::Reference< accessibility::XAccessible > &rxAc AtkObject * atk_object_wrapper_new( const css::uno::Reference< css::accessibility::XAccessible >& rxAccessible, - AtkObject* parent ) + AtkObject* parent, AtkObject* orig ) { g_return_val_if_fail( rxAccessible.get() != nullptr, nullptr ); @@ -818,6 +828,7 @@ atk_object_wrapper_new( const css::uno::Reference< css::accessibility::XAccessib pWrap->child_about_to_be_removed = nullptr; pWrap->mpContext = xContext; + pWrap->mpOrig = orig; AtkObject* atk_obj = ATK_OBJECT(pWrap); atk_obj->role = mapToAtkRole( xContext->getAccessibleRole() ); diff --git a/vcl/unx/gtk/a11y/atkwrapper.hxx b/vcl/unx/gtk/a11y/atkwrapper.hxx index e8ab83b5c778..0cb3f7b1c907 100644 --- a/vcl/unx/gtk/a11y/atkwrapper.hxx +++ b/vcl/unx/gtk/a11y/atkwrapper.hxx @@ -43,6 +43,7 @@ namespace com { namespace sun { namespace star { namespace accessibility { struct AtkObjectWrapper { AtkObject aParent; + AtkObject* mpOrig; //if we're a GtkDrawingArea acting as a custom LibreOffice widget, this is the toolkit default impl css::uno::Reference<css::accessibility::XAccessible> mpAccessible; css::uno::Reference<css::accessibility::XAccessibleContext> mpContext; @@ -79,7 +80,7 @@ AtkObject * atk_object_wrapper_ref( AtkObject * atk_object_wrapper_new( const css::uno::Reference< css::accessibility::XAccessible >& rxAccessible, - AtkObject* parent = nullptr ); + AtkObject* parent = nullptr, AtkObject* orig = nullptr ); void atk_object_wrapper_add_child(AtkObjectWrapper* wrapper, AtkObject *child, gint index); void atk_object_wrapper_remove_child(AtkObjectWrapper* wrapper, AtkObject *child, gint index); diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 250f5e845a99..b33013916a85 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -3485,6 +3485,7 @@ private: gulong m_nButtonReleaseSignalId; gulong m_nKeyPressSignalId; gulong m_nKeyReleaseSignalId; + gulong m_nStyleUpdatedSignalId; static gboolean signalDraw(GtkWidget*, cairo_t* cr, gpointer widget) { @@ -3529,6 +3530,16 @@ private: #endif m_aSizeAllocateHdl.Call(Size(nWidth, nHeight)); } + static void signalStyleUpdated(GtkWidget*, gpointer widget) + { + GtkInstanceDrawingArea* pThis = static_cast<GtkInstanceDrawingArea*>(widget); + SolarMutexGuard aGuard; + return pThis->signal_style_updated(); + } + void signal_style_updated() + { + m_aStyleUpdatedHdl.Call(*this); + } static gboolean signalButton(GtkWidget*, GdkEventButton* pEvent, gpointer widget) { GtkInstanceDrawingArea* pThis = static_cast<GtkInstanceDrawingArea*>(widget); @@ -3655,16 +3666,17 @@ public: , m_nButtonReleaseSignalId(g_signal_connect(m_pDrawingArea, "button-release-event", G_CALLBACK(signalButton), this)) , m_nKeyPressSignalId(g_signal_connect(m_pDrawingArea, "key-press-event", G_CALLBACK(signalKey), this)) , m_nKeyReleaseSignalId(g_signal_connect(m_pDrawingArea,"key-release-event", G_CALLBACK(signalKey), this)) + , m_nStyleUpdatedSignalId(g_signal_connect(m_pDrawingArea,"style-updated", G_CALLBACK(signalStyleUpdated), this)) { g_object_set_data(G_OBJECT(m_pDrawingArea), "g-lo-GtkInstanceDrawingArea", this); } - AtkObject* GetAtkObject() + AtkObject* GetAtkObject(AtkObject* pDefaultAccessible) { if (!m_pAccessible && m_xAccessible.is()) { GtkWidget* pParent = gtk_widget_get_parent(m_pWidget); - m_pAccessible = atk_object_wrapper_new(m_xAccessible, gtk_widget_get_accessible(pParent)); + m_pAccessible = atk_object_wrapper_new(m_xAccessible, gtk_widget_get_accessible(pParent), pDefaultAccessible); } return m_pAccessible; } @@ -3689,6 +3701,14 @@ public: return uno::Reference<css::accessibility::XAccessible>(); } + virtual a11yrelationset get_accessible_relation_set() override + { + //get_accessible_relation_set should only be needed for the vcl implementation, + //in the gtk impl the native equivalent should negate the need. + assert(false && "get_accessible_parent should only be called on a vcl impl"); + return uno::Reference<css::accessibility::XAccessibleRelationSet>(); + } + virtual ~GtkInstanceDrawingArea() override { g_object_steal_data(G_OBJECT(m_pDrawingArea), "g-lo-GtkInstanceDrawingArea"); @@ -3696,6 +3716,7 @@ public: g_object_unref(m_pAccessible); if (m_pSurface) cairo_surface_destroy(m_pSurface); + g_signal_handler_disconnect(m_pDrawingArea, m_nStyleUpdatedSignalId); g_signal_handler_disconnect(m_pDrawingArea, m_nKeyPressSignalId); g_signal_handler_disconnect(m_pDrawingArea, m_nKeyReleaseSignalId); g_signal_handler_disconnect(m_pDrawingArea, m_nButtonPressSignalId); @@ -4167,12 +4188,13 @@ AtkObject* (*default_drawing_area_get_accessible)(GtkWidget *widget); AtkObject* drawing_area_get_accessibity(GtkWidget *pWidget) { + AtkObject* pDefaultAccessible = default_drawing_area_get_accessible(pWidget); void* pData = g_object_get_data(G_OBJECT(pWidget), "g-lo-GtkInstanceDrawingArea"); GtkInstanceDrawingArea* pDrawingArea = static_cast<GtkInstanceDrawingArea*>(pData); - AtkObject *pAtkObj = pDrawingArea ? pDrawingArea->GetAtkObject() : nullptr; + AtkObject *pAtkObj = pDrawingArea ? pDrawingArea->GetAtkObject(pDefaultAccessible) : nullptr; if (pAtkObj) return pAtkObj; - return default_drawing_area_get_accessible(pWidget); + return pDefaultAccessible; } void ensure_intercept_drawing_area_accessibility() |