blob: e04ca4a536180267022bcc196af1077819ebd19b [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_vcl.hxx"
#include "vcl/vclevent.hxx"
#include "svdata.hxx"
#include <com/sun/star/accessibility/XAccessible.hpp>
using ::com::sun::star::uno::Reference;
using ::com::sun::star::accessibility::XAccessible;
TYPEINIT0(VclSimpleEvent);
TYPEINIT1(VclWindowEvent, VclSimpleEvent);
TYPEINIT1(VclMenuEvent, VclSimpleEvent);
VclAccessibleEvent::VclAccessibleEvent( sal_uLong n, const Reference<XAccessible>& rxAccessible ) :
VclSimpleEvent(n),
mxAccessible(rxAccessible)
{
}
VclAccessibleEvent::~VclAccessibleEvent()
{
}
Reference<XAccessible> VclAccessibleEvent::GetAccessible() const
{
return mxAccessible;
}
void VclEventListeners::Call( VclSimpleEvent* pEvent ) const
{
// Copy the list, because this can be destroyed when calling a Link...
std::list<Link> aCopy( *this );
std::list<Link>::iterator aIter( aCopy.begin() );
if( pEvent->IsA( VclWindowEvent::StaticType() ) )
{
VclWindowEvent* pWinEvent = static_cast<VclWindowEvent*>(pEvent);
ImplDelData aDel( pWinEvent->GetWindow() );
while ( aIter != aCopy.end() && ! aDel.IsDead() )
{
(*aIter).Call( pEvent );
aIter++;
}
}
else
{
while ( aIter != aCopy.end() )
{
(*aIter).Call( pEvent );
aIter++;
}
}
}
sal_Bool VclEventListeners::Process( VclSimpleEvent* pEvent ) const
{
sal_Bool bProcessed = sal_False;
// Copy the list, because this can be destroyed when calling a Link...
std::list<Link> aCopy( *this );
std::list<Link>::iterator aIter( aCopy.begin() );
while ( aIter != aCopy.end() )
{
if( (*aIter).Call( pEvent ) != 0 )
{
bProcessed = sal_True;
break;
}
aIter++;
}
return bProcessed;
}
VclEventListeners2::VclEventListeners2()
{
}
VclEventListeners2::~VclEventListeners2()
{
}
void VclEventListeners2::addListener( const Link& i_rLink )
{
// ensure uniqueness
for( std::list< Link >::const_iterator it = m_aListeners.begin(); it != m_aListeners.end(); ++it )
{
if( *it == i_rLink )
return;
}
m_aListeners.push_back( i_rLink );
}
void VclEventListeners2::removeListener( const Link& i_rLink )
{
size_t n = m_aIterators.size();
for( size_t i = 0; i < n; i++ )
{
if( m_aIterators[i].m_aIt != m_aListeners.end() && *m_aIterators[i].m_aIt == i_rLink )
{
m_aIterators[i].m_bWasInvalidated = true;
++m_aIterators[i].m_aIt;
}
}
m_aListeners.remove( i_rLink );
}
void VclEventListeners2::callListeners( VclSimpleEvent* i_pEvent )
{
vcl::DeletionListener aDel( this );
m_aIterators.push_back(ListenerIt(m_aListeners.begin()));
size_t nIndex = m_aIterators.size() - 1;
while( ! aDel.isDeleted() && m_aIterators[ nIndex ].m_aIt != m_aListeners.end() )
{
m_aIterators[ nIndex ].m_aIt->Call( i_pEvent );
if( m_aIterators[ nIndex ].m_bWasInvalidated )
// check if the current element was removed and the iterator increased in the meantime
m_aIterators[ nIndex ].m_bWasInvalidated = false;
else
++m_aIterators[ nIndex ].m_aIt;
}
m_aIterators.pop_back();
}