/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 .
*/
// register our property at the base class
registerPropertyNoMember(
u"CellRange"_ustr,
PROP_HANDLE_RANGE_ADDRESS,
PropertyAttribute::BOUND | PropertyAttribute::READONLY,
cppu::UnoType<CellRangeAddress>::get(),
css::uno::Any(CellRangeAddress())
);
}
void OCellListSource::getFastPropertyValue( std::unique_lock<std::mutex>& /*rGuard*/, Any& _rValue, sal_Int32 _nHandle ) const
{
OSL_ENSURE( _nHandle == PROP_HANDLE_RANGE_ADDRESS, "OCellListSource::getFastPropertyValue: invalid handle!" ); // we only have this one property...
_rValue <<= getRangeAddress( );
}
void OCellListSource::checkInitialized()
{ if ( !m_bInitialized ) throw NotInitializedException(u"CellListSource is not initialized"_ustr, getXWeak());
}
void SAL_CALL OCellListSource::disposing( const EventObject& aEvent )
{
Reference<XInterface> xRangeInt( m_xRange, UNO_QUERY ); if ( xRangeInt == aEvent.Source )
{ // release references to range object
m_xRange.clear();
}
}
void SAL_CALL OCellListSource::initialize( const Sequence< Any >& _rArguments )
{ if ( m_bInitialized ) throw RuntimeException(u"CellListSource is already initialized"_ustr, getXWeak());
// get the cell address
CellRangeAddress aRangeAddress; bool bFoundAddress = false;
for ( const Any& rArg : _rArguments )
{
NamedValue aValue; if ( rArg >>= aValue )
{ if ( aValue.Name == "CellRange" )
{ if ( aValue.Value >>= aRangeAddress )
{
bFoundAddress = true; break;
}
}
}
}
if ( !bFoundAddress ) throw RuntimeException(u"Cell not found"_ustr, getXWeak());
// determine the range we're bound to try
{ if ( m_xDocument.is() )
{ // first the sheets collection
Reference< XIndexAccess > xSheets(m_xDocument->getSheets( ), UNO_QUERY);
OSL_ENSURE( xSheets.is(), "OCellListSource::initialize: could not retrieve the sheets!" );
if ( xSheets.is() )
{ // the concrete sheet
Reference< XCellRange > xSheet(xSheets->getByIndex( aRangeAddress.Sheet ), UNO_QUERY);
OSL_ENSURE( xSheet.is(), "OCellListSource::initialize: NULL sheet, but no exception!" );
// the concrete cell if ( xSheet.is() )
{
m_xRange.set(xSheet->getCellRangeByPosition(
aRangeAddress.StartColumn, aRangeAddress.StartRow,
aRangeAddress.EndColumn, aRangeAddress.EndRow));
OSL_ENSURE( Reference< XCellRangeAddressable >( m_xRange, UNO_QUERY ).is(), "OCellListSource::initialize: either NULL range, or cell without address access!" );
}
}
}
} catch( const Exception& )
{
TOOLS_WARN_EXCEPTION( "sc", "OCellListSource::initialize: caught an exception while retrieving the cell object!" );
}
if ( !m_xRange.is() ) throw RuntimeException(u"Failed to retrieve cell range"_ustr, getXWeak());
Reference<XModifyBroadcaster> xBroadcaster( m_xRange, UNO_QUERY ); if ( xBroadcaster.is() )
{
xBroadcaster->addModifyListener( this );
}
// TODO: add as XEventListener to the cell range, so we get notified when it dies, // and can dispose ourself then
// TODO: somehow add as listener so we get notified when the address of the cell range changes // We need to forward this as change in our CellRange property to our property change listeners
// TODO: somehow add as listener to the cells in the range, so that we get notified // when their content changes. We need to forward this to our list entry listeners then
// TODO: somehow add as listener so that we get notified of insertions and removals of rows in our // range. In this case, we need to fire a change in our CellRange property, and additionally // notify our XListEntryListeners
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.