diff options
author | Caolán McNamara <caolanm@redhat.com> | 2014-07-22 14:25:51 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-07-22 14:37:39 +0100 |
commit | aff263c8b814c6bf352312403d3c1e448c8013a3 (patch) | |
tree | f003e927f21f97f84b76ba478ed6fb43b93a06f3 /sfx2/source | |
parent | 13807fbf9f3a4aae6767da8bcf796bea4b065159 (diff) |
Related: fdo#81457 quadratic time required when setting a11y name
when calling SetAccessibleName GetAccessibleName is called
in order to send a name changed a11y event. Getting an Accessible
Name is very slow in a non-layout aware widget because it scans
for a "nearby" label and there is none in this widget, but it
has a huge pile of other widgets to iterate over.
call add_mnemonic_label before hand to cut off that entire
branch.
While we're at it, only call InitControl to adjust to a new
width if the new width is different from the old width
Change-Id: Ie4ba1276127226e49442278e46447b84bbeb1cde
Diffstat (limited to 'sfx2/source')
-rw-r--r-- | sfx2/source/dialog/dinfdlg.cxx | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/sfx2/source/dialog/dinfdlg.cxx b/sfx2/source/dialog/dinfdlg.cxx index 7073d5ad6e24..f0fc12efd1c7 100644 --- a/sfx2/source/dialog/dinfdlg.cxx +++ b/sfx2/source/dialog/dinfdlg.cxx @@ -1354,10 +1354,13 @@ void CustomPropertyLine::SetRemoved() } CustomPropertiesWindow::CustomPropertiesWindow(Window* pParent, - const OUString &rHeaderAccName, - const OUString &rHeaderAccType, - const OUString &rHeaderAccValue) : + FixedText *pHeaderAccName, + FixedText *pHeaderAccType, + FixedText *pHeaderAccValue) : Window(pParent), + m_pHeaderAccName(pHeaderAccName), + m_pHeaderAccType(pHeaderAccType), + m_pHeaderAccValue(pHeaderAccValue), m_aNameBox ( this, SfxResId( SFX_CB_PROPERTY_NAME ) ), m_aTypeBox ( this, SfxResId( SFX_LB_PROPERTY_TYPE ) ), m_aValueEdit ( this, SfxResId( SFX_ED_PROPERTY_VALUE ) ), @@ -1378,9 +1381,12 @@ CustomPropertiesWindow::CustomPropertiesWindow(Window* pParent, m_aBoxLoseFocusTimer.SetTimeout( 300 ); m_aBoxLoseFocusTimer.SetTimeoutHdl( LINK( this, CustomPropertiesWindow, BoxTimeoutHdl ) ); - m_aNameBox.SetAccessibleName(rHeaderAccName); - m_aTypeBox.SetAccessibleName(rHeaderAccType); - m_aValueEdit.SetAccessibleName(rHeaderAccValue); + m_aNameBox.add_mnemonic_label(m_pHeaderAccName); + m_aNameBox.SetAccessibleName(m_pHeaderAccName->GetText()); + m_aTypeBox.add_mnemonic_label(m_pHeaderAccType); + m_aTypeBox.SetAccessibleName(m_pHeaderAccType->GetText()); + m_aValueEdit.add_mnemonic_label(m_pHeaderAccValue); + m_aValueEdit.SetAccessibleName(m_pHeaderAccValue->GetText()); m_aNameBox.Hide(); m_aTypeBox.Hide(); @@ -1546,8 +1552,10 @@ void CustomPropertiesWindow::ValidateLine( CustomPropertyLine* pLine, bool bIsFr } } -void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar ) +bool CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar ) { + bool bChanged = false; + DBG_ASSERT( pHeaderBar, "CustomPropertiesWindow::InitControls(): invalid headerbar" ); DBG_ASSERT( pScrollBar, "CustomPropertiesWindow::InitControls(): invalid scrollbar" ); @@ -1568,14 +1576,21 @@ void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBa while ( *pCurrent ) { Rectangle aRect = pHeaderBar->GetItemRect( pHeaderBar->GetItemId( nPos++ ) ); - Size aSize = (*pCurrent)->GetSizePixel(); - Point aPos = (*pCurrent)->GetPosPixel(); + Size aOrigSize = (*pCurrent)->GetSizePixel(); + Point aOrigPos = (*pCurrent)->GetPosPixel(); + Size aSize(aOrigSize); + Point aPos(aOrigPos); long nWidth = aRect.GetWidth() - nOffset; if ( *pCurrent == &m_aRemoveButton ) nWidth -= pScrollBar->GetSizePixel().Width(); aSize.Width() = nWidth; aPos.X() = aRect.getX() + ( nOffset / 2 ); - (*pCurrent)->SetPosSizePixel( aPos, aSize ); + + if (aOrigSize != aSize || aOrigPos != aPos) + { + (*pCurrent)->SetPosSizePixel(aPos, aSize); + bChanged = true; + } if ( *pCurrent == &m_aValueEdit ) { @@ -1600,6 +1615,7 @@ void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBa pCurrent++; } + return bChanged; } sal_uInt16 CustomPropertiesWindow::GetVisibleLineCount() const @@ -1659,9 +1675,12 @@ void CustomPropertiesWindow::AddLine( const OUString& sName, Any& rAny ) pNewLine->m_aTypeBox.SetLoseFocusHdl( LINK( this, CustomPropertiesWindow, BoxLoseFocusHdl ) ); - pNewLine->m_aNameBox.SetAccessibleName(m_aNameBox.GetAccessibleName()); - pNewLine->m_aTypeBox.SetAccessibleName(m_aTypeBox.GetAccessibleName()); - pNewLine->m_aValueEdit.SetAccessibleName(m_aValueEdit.GetAccessibleName()); + pNewLine->m_aNameBox.add_mnemonic_label(m_pHeaderAccName); + pNewLine->m_aNameBox.SetAccessibleName(m_pHeaderAccName->GetText()); + pNewLine->m_aTypeBox.add_mnemonic_label(m_pHeaderAccType); + pNewLine->m_aTypeBox.SetAccessibleName(m_pHeaderAccType->GetText()); + pNewLine->m_aValueEdit.add_mnemonic_label(m_pHeaderAccValue); + pNewLine->m_aValueEdit.SetAccessibleName(m_pHeaderAccValue->GetText()); sal_Int32 nPos = GetVisibleLineCount() * GetLineHeight(); m_aCustomPropertiesLines.push_back( pNewLine ); @@ -1925,10 +1944,13 @@ void CustomPropertiesControl::Init(VclBuilderContainer& rBuilder) { m_pHeaderBar = new HeaderBar(this, WB_BUTTONSTYLE | WB_BOTTOMBORDER); m_pBody = new VclHBox(this); - OUString sName = rBuilder.get<FixedText>("name")->GetText(); - OUString sType = rBuilder.get<FixedText>("type")->GetText(); - OUString sValue = rBuilder.get<FixedText>("value")->GetText(); - m_pPropertiesWin = new CustomPropertiesWindow(m_pBody, sName, sType, sValue); + FixedText* pName = rBuilder.get<FixedText>("name"); + FixedText* pType = rBuilder.get<FixedText>("type"); + FixedText* pValue = rBuilder.get<FixedText>("value"); + OUString sName = pName->GetText(); + OUString sType = pType->GetText(); + OUString sValue = pValue->GetText(); + m_pPropertiesWin = new CustomPropertiesWindow(m_pBody, pName, pType, pValue); m_pVertScroll = new ScrollBar(m_pBody, WB_VERT); set_hexpand(true); @@ -1976,12 +1998,15 @@ void CustomPropertiesControl::setAllocation(const Size &rAllocation) { VclVBox::setAllocation(rAllocation); - m_pPropertiesWin->InitControls( m_pHeaderBar, m_pVertScroll ); + bool bWidgetsResized = m_pPropertiesWin->InitControls( m_pHeaderBar, m_pVertScroll ); sal_Int32 nScrollOffset = m_pPropertiesWin->GetLineHeight(); sal_Int32 nVisibleEntries = m_pPropertiesWin->GetSizePixel().Height() / nScrollOffset; m_pVertScroll->SetPageSize( nVisibleEntries - 1 ); m_pVertScroll->SetVisibleSize( nVisibleEntries ); - m_pPropertiesWin->updateLineWidth(); + if (bWidgetsResized) + { + m_pPropertiesWin->updateLineWidth(); + } } extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeCustomPropertiesControl(Window *pParent, |