diff options
author | Caolán McNamara <caolanm@redhat.com> | 2014-07-22 14:20:33 +0100 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2014-07-25 14:44:02 +0000 |
commit | 602b4643e0d92a1b8102032652abb2b08c790ec2 (patch) | |
tree | b68d13e3412a1980a449280d380e839bddc7f5fa /sfx2 | |
parent | ca88a0ea6ed7277e8522d83458e3cfb975fcfb7d (diff) |
Related: fdo#81457 skip setting an empty allocation
if the dimension is 0, don't bother calculating
a bunch of <= 0 sizes, rely on the parents clipping
to hide the lot instead
Change-Id: I5b593a5b6b6c3614beb7f9bf3328fa469b700972
(cherry picked from commit 13807fbf9f3a4aae6767da8bcf796bea4b065159)
and
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
(cherry picked from commit aff263c8b814c6bf352312403d3c1e448c8013a3)
Reviewed-on: https://gerrit.libreoffice.org/10461
Reviewed-by: David Tardon <dtardon@redhat.com>
Tested-by: David Tardon <dtardon@redhat.com>
Diffstat (limited to 'sfx2')
-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 57a5f94e31f9..2458b54d6d30 100644 --- a/sfx2/source/dialog/dinfdlg.cxx +++ b/sfx2/source/dialog/dinfdlg.cxx @@ -1366,10 +1366,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 ) ), @@ -1390,9 +1393,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(); @@ -1558,8 +1564,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" ); @@ -1580,14 +1588,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 ) { @@ -1612,6 +1627,7 @@ void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBa pCurrent++; } + return bChanged; } sal_uInt16 CustomPropertiesWindow::GetVisibleLineCount() const @@ -1671,9 +1687,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()); long nPos = GetVisibleLineCount() * GetLineHeight(); m_aCustomPropertiesLines.push_back( pNewLine ); @@ -1937,10 +1956,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); @@ -1988,12 +2010,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, |