Kaydet (Commit) aff263c8 authored tarafından Caolán McNamara's avatar Caolán McNamara

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
üst 13807fbf
...@@ -407,6 +407,10 @@ struct CustomPropertyLine ...@@ -407,6 +407,10 @@ struct CustomPropertyLine
class CustomPropertiesWindow : public Window class CustomPropertiesWindow : public Window
{ {
private: private:
FixedText* m_pHeaderAccName;
FixedText* m_pHeaderAccType;
FixedText* m_pHeaderAccValue;
ComboBox m_aNameBox; ComboBox m_aNameBox;
ListBox m_aTypeBox; ListBox m_aTypeBox;
Edit m_aValueEdit; Edit m_aValueEdit;
...@@ -441,13 +445,13 @@ private: ...@@ -441,13 +445,13 @@ private:
public: public:
CustomPropertiesWindow(Window* pParent, CustomPropertiesWindow(Window* pParent,
const OUString &rHeaderAccName, FixedText *pHeaderAccName,
const OUString &rHeaderAccType, FixedText *pHeaderAccType,
const OUString &rHeaderAccValue); FixedText *pHeaderAccValue);
virtual ~CustomPropertiesWindow(); virtual ~CustomPropertiesWindow();
void InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar ); bool InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar );
sal_uInt16 GetVisibleLineCount() const; sal_uInt16 GetVisibleLineCount() const;
inline sal_Int32 GetLineHeight() const { return m_nLineHeight; } inline sal_Int32 GetLineHeight() const { return m_nLineHeight; }
void AddLine( const OUString& sName, com::sun::star::uno::Any& rAny ); void AddLine( const OUString& sName, com::sun::star::uno::Any& rAny );
bool AreAllLinesValid() const; bool AreAllLinesValid() const;
......
...@@ -1354,10 +1354,13 @@ void CustomPropertyLine::SetRemoved() ...@@ -1354,10 +1354,13 @@ void CustomPropertyLine::SetRemoved()
} }
CustomPropertiesWindow::CustomPropertiesWindow(Window* pParent, CustomPropertiesWindow::CustomPropertiesWindow(Window* pParent,
const OUString &rHeaderAccName, FixedText *pHeaderAccName,
const OUString &rHeaderAccType, FixedText *pHeaderAccType,
const OUString &rHeaderAccValue) : FixedText *pHeaderAccValue) :
Window(pParent), Window(pParent),
m_pHeaderAccName(pHeaderAccName),
m_pHeaderAccType(pHeaderAccType),
m_pHeaderAccValue(pHeaderAccValue),
m_aNameBox ( this, SfxResId( SFX_CB_PROPERTY_NAME ) ), m_aNameBox ( this, SfxResId( SFX_CB_PROPERTY_NAME ) ),
m_aTypeBox ( this, SfxResId( SFX_LB_PROPERTY_TYPE ) ), m_aTypeBox ( this, SfxResId( SFX_LB_PROPERTY_TYPE ) ),
m_aValueEdit ( this, SfxResId( SFX_ED_PROPERTY_VALUE ) ), m_aValueEdit ( this, SfxResId( SFX_ED_PROPERTY_VALUE ) ),
...@@ -1378,9 +1381,12 @@ CustomPropertiesWindow::CustomPropertiesWindow(Window* pParent, ...@@ -1378,9 +1381,12 @@ CustomPropertiesWindow::CustomPropertiesWindow(Window* pParent,
m_aBoxLoseFocusTimer.SetTimeout( 300 ); m_aBoxLoseFocusTimer.SetTimeout( 300 );
m_aBoxLoseFocusTimer.SetTimeoutHdl( LINK( this, CustomPropertiesWindow, BoxTimeoutHdl ) ); m_aBoxLoseFocusTimer.SetTimeoutHdl( LINK( this, CustomPropertiesWindow, BoxTimeoutHdl ) );
m_aNameBox.SetAccessibleName(rHeaderAccName); m_aNameBox.add_mnemonic_label(m_pHeaderAccName);
m_aTypeBox.SetAccessibleName(rHeaderAccType); m_aNameBox.SetAccessibleName(m_pHeaderAccName->GetText());
m_aValueEdit.SetAccessibleName(rHeaderAccValue); 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_aNameBox.Hide();
m_aTypeBox.Hide(); m_aTypeBox.Hide();
...@@ -1546,8 +1552,10 @@ void CustomPropertiesWindow::ValidateLine( CustomPropertyLine* pLine, bool bIsFr ...@@ -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( pHeaderBar, "CustomPropertiesWindow::InitControls(): invalid headerbar" );
DBG_ASSERT( pScrollBar, "CustomPropertiesWindow::InitControls(): invalid scrollbar" ); DBG_ASSERT( pScrollBar, "CustomPropertiesWindow::InitControls(): invalid scrollbar" );
...@@ -1568,14 +1576,21 @@ void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBa ...@@ -1568,14 +1576,21 @@ void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBa
while ( *pCurrent ) while ( *pCurrent )
{ {
Rectangle aRect = pHeaderBar->GetItemRect( pHeaderBar->GetItemId( nPos++ ) ); Rectangle aRect = pHeaderBar->GetItemRect( pHeaderBar->GetItemId( nPos++ ) );
Size aSize = (*pCurrent)->GetSizePixel(); Size aOrigSize = (*pCurrent)->GetSizePixel();
Point aPos = (*pCurrent)->GetPosPixel(); Point aOrigPos = (*pCurrent)->GetPosPixel();
Size aSize(aOrigSize);
Point aPos(aOrigPos);
long nWidth = aRect.GetWidth() - nOffset; long nWidth = aRect.GetWidth() - nOffset;
if ( *pCurrent == &m_aRemoveButton ) if ( *pCurrent == &m_aRemoveButton )
nWidth -= pScrollBar->GetSizePixel().Width(); nWidth -= pScrollBar->GetSizePixel().Width();
aSize.Width() = nWidth; aSize.Width() = nWidth;
aPos.X() = aRect.getX() + ( nOffset / 2 ); 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 ) if ( *pCurrent == &m_aValueEdit )
{ {
...@@ -1600,6 +1615,7 @@ void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBa ...@@ -1600,6 +1615,7 @@ void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBa
pCurrent++; pCurrent++;
} }
return bChanged;
} }
sal_uInt16 CustomPropertiesWindow::GetVisibleLineCount() const sal_uInt16 CustomPropertiesWindow::GetVisibleLineCount() const
...@@ -1659,9 +1675,12 @@ void CustomPropertiesWindow::AddLine( const OUString& sName, Any& rAny ) ...@@ -1659,9 +1675,12 @@ void CustomPropertiesWindow::AddLine( const OUString& sName, Any& rAny )
pNewLine->m_aTypeBox.SetLoseFocusHdl( LINK( this, CustomPropertiesWindow, BoxLoseFocusHdl ) ); pNewLine->m_aTypeBox.SetLoseFocusHdl( LINK( this, CustomPropertiesWindow, BoxLoseFocusHdl ) );
pNewLine->m_aNameBox.SetAccessibleName(m_aNameBox.GetAccessibleName()); pNewLine->m_aNameBox.add_mnemonic_label(m_pHeaderAccName);
pNewLine->m_aTypeBox.SetAccessibleName(m_aTypeBox.GetAccessibleName()); pNewLine->m_aNameBox.SetAccessibleName(m_pHeaderAccName->GetText());
pNewLine->m_aValueEdit.SetAccessibleName(m_aValueEdit.GetAccessibleName()); 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(); sal_Int32 nPos = GetVisibleLineCount() * GetLineHeight();
m_aCustomPropertiesLines.push_back( pNewLine ); m_aCustomPropertiesLines.push_back( pNewLine );
...@@ -1925,10 +1944,13 @@ void CustomPropertiesControl::Init(VclBuilderContainer& rBuilder) ...@@ -1925,10 +1944,13 @@ void CustomPropertiesControl::Init(VclBuilderContainer& rBuilder)
{ {
m_pHeaderBar = new HeaderBar(this, WB_BUTTONSTYLE | WB_BOTTOMBORDER); m_pHeaderBar = new HeaderBar(this, WB_BUTTONSTYLE | WB_BOTTOMBORDER);
m_pBody = new VclHBox(this); m_pBody = new VclHBox(this);
OUString sName = rBuilder.get<FixedText>("name")->GetText(); FixedText* pName = rBuilder.get<FixedText>("name");
OUString sType = rBuilder.get<FixedText>("type")->GetText(); FixedText* pType = rBuilder.get<FixedText>("type");
OUString sValue = rBuilder.get<FixedText>("value")->GetText(); FixedText* pValue = rBuilder.get<FixedText>("value");
m_pPropertiesWin = new CustomPropertiesWindow(m_pBody, sName, sType, sValue); 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); m_pVertScroll = new ScrollBar(m_pBody, WB_VERT);
set_hexpand(true); set_hexpand(true);
...@@ -1976,12 +1998,15 @@ void CustomPropertiesControl::setAllocation(const Size &rAllocation) ...@@ -1976,12 +1998,15 @@ void CustomPropertiesControl::setAllocation(const Size &rAllocation)
{ {
VclVBox::setAllocation(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 nScrollOffset = m_pPropertiesWin->GetLineHeight();
sal_Int32 nVisibleEntries = m_pPropertiesWin->GetSizePixel().Height() / nScrollOffset; sal_Int32 nVisibleEntries = m_pPropertiesWin->GetSizePixel().Height() / nScrollOffset;
m_pVertScroll->SetPageSize( nVisibleEntries - 1 ); m_pVertScroll->SetPageSize( nVisibleEntries - 1 );
m_pVertScroll->SetVisibleSize( nVisibleEntries ); m_pVertScroll->SetVisibleSize( nVisibleEntries );
m_pPropertiesWin->updateLineWidth(); if (bWidgetsResized)
{
m_pPropertiesWin->updateLineWidth();
}
} }
extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeCustomPropertiesControl(Window *pParent, extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeCustomPropertiesControl(Window *pParent,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment