/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #include "RptPage.hxx" #include "RptModel.hxx" #include "Section.hxx" #include "RptObject.hxx" #include #include #include "ReportDrawPage.hxx" namespace rptui { using namespace ::com::sun::star; TYPEINIT1( OReportPage, SdrPage ); //---------------------------------------------------------------------------- DBG_NAME( rpt_OReportPage ) OReportPage::OReportPage( OReportModel& _rModel ,const uno::Reference< report::XSection >& _xSection ,bool bMasterPage ) :SdrPage( _rModel, bMasterPage ) ,rModel(_rModel) ,m_xSection(_xSection) ,m_bSpecialInsertMode(false) { DBG_CTOR( rpt_OReportPage,NULL); } //---------------------------------------------------------------------------- OReportPage::OReportPage( const OReportPage& rPage ) :SdrPage( rPage ) ,rModel(rPage.rModel) ,m_xSection(rPage.m_xSection) ,m_bSpecialInsertMode(rPage.m_bSpecialInsertMode) ,m_aTemporaryObjectList(rPage.m_aTemporaryObjectList) { DBG_CTOR( rpt_OReportPage,NULL); } //---------------------------------------------------------------------------- OReportPage::~OReportPage() { DBG_DTOR( rpt_OReportPage,NULL); } //---------------------------------------------------------------------------- SdrPage* OReportPage::Clone() const { DBG_CHKTHIS( rpt_OReportPage,NULL); return new OReportPage( *this ); } //---------------------------------------------------------------------------- ULONG OReportPage::getIndexOf(const uno::Reference< report::XReportComponent >& _xObject) { DBG_CHKTHIS( rpt_OReportPage,NULL); ULONG nCount = GetObjCount(); ULONG i = 0; for (; i < nCount; ++i) { OObjectBase* pObj = dynamic_cast(GetObj(i)); OSL_ENSURE(pObj,"Invalid object found!"); if ( pObj && pObj->getReportComponent() == _xObject ) { break; } } return i; } //---------------------------------------------------------------------------- void OReportPage::removeSdrObject(const uno::Reference< report::XReportComponent >& _xObject) { DBG_CHKTHIS( rpt_OReportPage,NULL); ULONG nPos = getIndexOf(_xObject); if ( nPos < GetObjCount() ) { OObjectBase* pBase = dynamic_cast(GetObj(nPos)); OSL_ENSURE(pBase,"Why is this not a OObjectBase?"); if ( pBase ) pBase->EndListening(); RemoveObject(nPos); } } // ----------------------------------------------------------------------------- SdrObject* OReportPage::RemoveObject(ULONG nObjNum) { SdrObject* pObj = SdrPage::RemoveObject(nObjNum); if (getSpecialMode()) { return pObj; } // this code is evil, but what else shall I do reportdesign::OSection* pSection = reportdesign::OSection::getImplementation(m_xSection); uno::Reference< drawing::XShape> xShape(pObj->getUnoShape(),uno::UNO_QUERY); pSection->notifyElementRemoved(xShape); if (pObj->ISA(OUnoObject)) { OUnoObject* pUnoObj = dynamic_cast(pObj); uno::Reference< container::XChild> xChild(pUnoObj->GetUnoControlModel(),uno::UNO_QUERY); if ( xChild.is() ) xChild->setParent(NULL); } return pObj; } //---------------------------------------------------------------------------- void OReportPage::insertObject(const uno::Reference< report::XReportComponent >& _xObject) { DBG_CHKTHIS( rpt_OReportPage,NULL); OSL_ENSURE(_xObject.is(),"Object is not valid to create a SdrObject!"); if ( !_xObject.is() ) return; ULONG nPos = getIndexOf(_xObject); if ( nPos < GetObjCount() ) return; // Object already in list SvxShape* pShape = SvxShape::getImplementation( _xObject ); OObjectBase* pObject = pShape ? dynamic_cast< OObjectBase* >( pShape->GetSdrObject() ) : NULL; OSL_ENSURE( pObject, "OReportPage::insertObject: no implementation object found for the given shape/component!" ); if ( pObject ) pObject->StartListening(); } // ----------------------------------------------------------------------------- uno::Reference< report::XSection > OReportPage::getSection() const { return m_xSection; } // ----------------------------------------------------------------------------- uno::Reference< uno::XInterface > OReportPage::createUnoPage() { return static_cast( new reportdesign::OReportDrawPage(this,m_xSection) ); } // ----------------------------------------------------------------------------- void OReportPage::removeTempObject(SdrObject *_pToRemoveObj) { if (_pToRemoveObj) { for (ULONG i=0;i::iterator aIter = m_aTemporaryObjectList.begin(); ::std::vector::iterator aEnd = m_aTemporaryObjectList.end(); for (; aIter != aEnd; ++aIter) { removeTempObject(*aIter); } m_aTemporaryObjectList.clear(); rModel.SetChanged(bChanged); m_bSpecialInsertMode = false; } // ----------------------------------------------------------------------------- void OReportPage::NbcInsertObject(SdrObject* pObj, ULONG nPos, const SdrInsertReason* pReason) { SdrPage::NbcInsertObject(pObj, nPos, pReason); OUnoObject* pUnoObj = dynamic_cast< OUnoObject* >( pObj ); if (getSpecialMode()) { m_aTemporaryObjectList.push_back(pObj); return; } if ( pUnoObj ) { pUnoObj->CreateMediator(); uno::Reference< container::XChild> xChild(pUnoObj->GetUnoControlModel(),uno::UNO_QUERY); if ( xChild.is() && !xChild->getParent().is() ) xChild->setParent(m_xSection); } // this code is evil, but what else shall I do reportdesign::OSection* pSection = reportdesign::OSection::getImplementation(m_xSection); uno::Reference< drawing::XShape> xShape(pObj->getUnoShape(),uno::UNO_QUERY); pSection->notifyElementAdded(xShape); // now that the shape is inserted into its structures, we can allow the OObjectBase // to release the reference to it OObjectBase* pObjectBase = dynamic_cast< OObjectBase* >( pObj ); OSL_ENSURE( pObjectBase, "OReportPage::NbcInsertObject: what is being inserted here?" ); if ( pObjectBase ) pObjectBase->releaseUnoShape(); } //============================================================================ } // rptui //============================================================================ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */