reportdesign/source/core/sdr/RptModel.cxx | 1 svx/Package_inc.mk | 1 svx/inc/svx/itextprovider.hxx | 42 ++++++++++++++ svx/inc/svx/sdr/contact/displayinfo.hxx | 14 ---- svx/inc/svx/sdr/properties/textproperties.hxx | 4 + svx/inc/svx/svdmodel.hxx | 3 - svx/inc/svx/svdotext.hxx | 3 - svx/source/sdr/contact/displayinfo.cxx | 6 -- svx/source/sdr/contact/viewobjectcontactofpageobj.cxx | 2 svx/source/sdr/properties/textproperties.cxx | 38 ++++++++----- svx/source/svdraw/svdmodel.cxx | 18 +----- svx/source/table/cell.cxx | 52 ++++++++++++++++++ 12 files changed, 131 insertions(+), 53 deletions(-)
New commits: commit 91864e19c84ae9834d6e97ee5ddc4db5bf957681 Author: David Tardon <[email protected]> Date: Fri Mar 22 16:49:41 2013 +0100 rhbz#876742 speed up table manipulation in Impress It turns out this is not actually a performance problem but an oversight in implementation (or a bug, if you want .-) Every manipulation with a table (e.g., move, resize; actually even a selection of the table) leads to creation of a full copy of the table (SdrObject::getFullDragClone()). One of the actions the table copy impl. does is to call sdr::CellProperties::SetStyleSheet() on every cell of the new table. CellProperties is derived from sdr::properties::TextProperties and CellProperties::SetStyleSheet() just passes the call to TextProperties::SetStyleSheet(). This is where the trouble begins :-) The SDR representation of a table, SdrTableObj, is derived from SdrTextObj. Because of that, SdrTextObj needs to be able to contain more than one SdrText (because a table needs one for every cell). This is handled correctly by TextProperties. But, because there is no SDR representation of a single cell, CellProperties uses the SdrTableObj as the SDR object it works on. Therefore TextProperties::SetStyleSheet() processes all SdrText objects of the _whole table_, not just a single cell. And this is repeated for every other cell... Change-Id: Iab2e2d0e1e8038710645c0bd24666e6032b0a003 diff --git a/svx/Package_inc.mk b/svx/Package_inc.mk index e1deeab..cb54894 100644 --- a/svx/Package_inc.mk +++ b/svx/Package_inc.mk @@ -31,6 +31,7 @@ $(eval $(call gb_Package_add_file,svx_inc,inc/svx/xftdiit.hxx,svx/xftdiit.hxx)) $(eval $(call gb_Package_add_file,svx_inc,inc/svx/fntctl.hxx,svx/fntctl.hxx)) $(eval $(call gb_Package_add_file,svx_inc,inc/svx/svdattr.hxx,svx/svdattr.hxx)) $(eval $(call gb_Package_add_file,svx_inc,inc/svx/imapdlg.hxx,svx/imapdlg.hxx)) +$(eval $(call gb_Package_add_file,svx_inc,inc/svx/itextprovider.hxx,svx/itextprovider.hxx)) $(eval $(call gb_Package_add_file,svx_inc,inc/svx/linkwarn.hxx,svx/linkwarn.hxx)) $(eval $(call gb_Package_add_file,svx_inc,inc/svx/formatpaintbrushctrl.hxx,svx/formatpaintbrushctrl.hxx)) $(eval $(call gb_Package_add_file,svx_inc,inc/svx/xcolit.hxx,svx/xcolit.hxx)) diff --git a/svx/inc/svx/itextprovider.hxx b/svx/inc/svx/itextprovider.hxx new file mode 100644 index 0000000..3202e4d --- /dev/null +++ b/svx/inc/svx/itextprovider.hxx @@ -0,0 +1,42 @@ +/* -*- 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/. + */ + +#if !defined SVX_ITEXTPROVIDER_HXX_INCLUDED +#define SVX_ITEXTPROVIDER_HXX_INCLUDED + +#include <sal/types.h> + +#include <svx/svxdllapi.h> + +class SdrText; + +namespace svx +{ + + /** This interface provides access to text object(s) in an SdrObject. + + */ + class SVX_DLLPUBLIC ITextProvider + { + public: + /** Return the number of texts available for this object. */ + virtual sal_Int32 getTextCount() const = 0; + + /** Return the nth available text. */ + virtual SdrText* getText(sal_Int32 nIndex) const = 0; + + protected: + ~ITextProvider() {} + }; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/inc/svx/sdr/properties/textproperties.hxx b/svx/inc/svx/sdr/properties/textproperties.hxx index ac6a613..456b104 100644 --- a/svx/inc/svx/sdr/properties/textproperties.hxx +++ b/svx/inc/svx/sdr/properties/textproperties.hxx @@ -20,6 +20,7 @@ #ifndef _SDR_PROPERTIES_TEXTPROPERTIES_HXX #define _SDR_PROPERTIES_TEXTPROPERTIES_HXX +#include <svx/itextprovider.hxx> #include <svx/sdr/properties/attributeproperties.hxx> #include "svx/svxdllapi.h" @@ -45,6 +46,9 @@ namespace sdr // react on ItemSet changes virtual void ItemSetChanged(const SfxItemSet& rSet); + /// Get the TextProvider related to our SdrObject + virtual const svx::ITextProvider& getTextProvider() const; + public: // basic constructor explicit TextProperties(SdrObject& rObj); diff --git a/svx/inc/svx/svdotext.hxx b/svx/inc/svx/svdotext.hxx index 30a923b..a5df49b 100644 --- a/svx/inc/svx/svdotext.hxx +++ b/svx/inc/svx/svdotext.hxx @@ -21,6 +21,7 @@ #define _SVDOTEXT_HXX #include <vcl/field.hxx> +#include <svx/itextprovider.hxx> #include <svx/svdoattr.hxx> #include <svx/svdtrans.hxx> // GeoStat #include <tools/datetime.hxx> @@ -123,7 +124,7 @@ namespace sdr // SdrTextObj //************************************************************ -class SVX_DLLPUBLIC SdrTextObj : public SdrAttrObj +class SVX_DLLPUBLIC SdrTextObj : public SdrAttrObj, public svx::ITextProvider { private: // Cell needs access to ImpGetDrawOutliner(); diff --git a/svx/source/sdr/properties/textproperties.cxx b/svx/source/sdr/properties/textproperties.cxx index e4b7f5f..156268f 100644 --- a/svx/source/sdr/properties/textproperties.cxx +++ b/svx/source/sdr/properties/textproperties.cxx @@ -82,14 +82,15 @@ namespace sdr void TextProperties::ItemSetChanged(const SfxItemSet& rSet) { SdrTextObj& rObj = (SdrTextObj&)GetSdrObject(); - sal_Int32 nText = rObj.getTextCount(); + const svx::ITextProvider& rTextProvider(getTextProvider()); + sal_Int32 nText = rTextProvider.getTextCount(); // #i101556# ItemSet has changed -> new version maVersion++; while( --nText >= 0 ) { - SdrText* pText = rObj.getText( nText ); + SdrText* pText = rTextProvider.getText( nText ); OutlinerParaObject* pParaObj = pText ? pText->GetOutlinerParaObject() : 0; @@ -170,10 +171,11 @@ namespace sdr { SdrOutliner& rOutliner = rObj.ImpGetDrawOutliner(); - sal_Int32 nCount = rObj.getTextCount(); + const svx::ITextProvider& rTextProvider(getTextProvider()); + sal_Int32 nCount = rTextProvider.getTextCount(); while( nCount-- ) { - SdrText* pText = rObj.getText( nCount ); + SdrText* pText = rTextProvider.getText( nCount ); OutlinerParaObject* pParaObj = pText->GetOutlinerParaObject(); if( pParaObj ) { @@ -223,6 +225,11 @@ namespace sdr } } + const svx::ITextProvider& TextProperties::getTextProvider() const + { + return static_cast<const SdrTextObj&>(GetSdrObject()); + } + void TextProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr) { SdrTextObj& rObj = (SdrTextObj&)GetSdrObject(); @@ -237,11 +244,12 @@ namespace sdr { SdrOutliner& rOutliner = rObj.ImpGetDrawOutliner(); - sal_Int32 nText = rObj.getTextCount(); + const svx::ITextProvider& rTextProvider(getTextProvider()); + sal_Int32 nText = rTextProvider.getTextCount(); while( --nText >= 0 ) { - SdrText* pText = rObj.getText( nText ); + SdrText* pText = rTextProvider.getText( nText ); OutlinerParaObject* pParaObj = pText ? pText->GetOutlinerParaObject() : 0; if( !pParaObj ) @@ -396,11 +404,12 @@ namespace sdr && !rObj.IsLinkedText()) { Outliner* pOutliner = SdrMakeOutliner(OUTLINERMODE_OUTLINEOBJECT, rObj.GetModel()); - sal_Int32 nText = rObj.getTextCount(); + const svx::ITextProvider& rTextProvider(getTextProvider()); + sal_Int32 nText = rTextProvider.getTextCount(); while( --nText >= 0 ) { - SdrText* pText = rObj.getText( nText ); + SdrText* pText = rTextProvider.getText( nText ); OutlinerParaObject* pParaObj = pText ? pText->GetOutlinerParaObject() : 0; if( !pParaObj ) @@ -542,6 +551,7 @@ namespace sdr SdrTextObj& rObj = (SdrTextObj&)GetSdrObject(); if(rObj.HasText()) { + const svx::ITextProvider& rTextProvider(getTextProvider()); if(HAS_BASE(SfxStyleSheet, &rBC)) { SfxSimpleHint* pSimple = PTR_CAST(SfxSimpleHint, &rHint); @@ -551,10 +561,10 @@ namespace sdr { rObj.SetPortionInfoChecked(sal_False); - sal_Int32 nText = rObj.getTextCount(); + sal_Int32 nText = rTextProvider.getTextCount(); while( --nText > 0 ) { - OutlinerParaObject* pParaObj = rObj.getText(nText )->GetOutlinerParaObject(); + OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject(); if( pParaObj ) pParaObj->ClearPortionInfo(); } @@ -574,10 +584,10 @@ namespace sdr if(SFX_HINT_DYING == nId) { rObj.SetPortionInfoChecked(sal_False); - sal_Int32 nText = rObj.getTextCount(); + sal_Int32 nText = rTextProvider.getTextCount(); while( --nText > 0 ) { - OutlinerParaObject* pParaObj = rObj.getText(nText )->GetOutlinerParaObject(); + OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject(); if( pParaObj ) pParaObj->ClearPortionInfo(); } @@ -596,10 +606,10 @@ namespace sdr if(!aOldName.Equals(aNewName)) { - sal_Int32 nText = rObj.getTextCount(); + sal_Int32 nText = rTextProvider.getTextCount(); while( --nText > 0 ) { - OutlinerParaObject* pParaObj = rObj.getText(nText )->GetOutlinerParaObject(); + OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject(); if( pParaObj ) pParaObj->ChangeStyleSheetName(eFamily, aOldName, aNewName); } diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx index e46b486..3a33a28 100644 --- a/svx/source/table/cell.cxx +++ b/svx/source/table/cell.cxx @@ -99,6 +99,46 @@ static const SvxItemPropertySet* ImplGetSvxCellPropertySet() return &aSvxCellPropertySet; } +namespace +{ + +class CellTextProvider : public svx::ITextProvider +{ +public: + explicit CellTextProvider(const sdr::table::CellRef xCell); + virtual ~CellTextProvider(); + +private: + virtual sal_Int32 getTextCount() const; + virtual SdrText* getText(sal_Int32 nIndex) const; + +private: + const sdr::table::CellRef m_xCell; +}; + +CellTextProvider::CellTextProvider(const sdr::table::CellRef xCell) + : m_xCell(xCell) +{ +} + +CellTextProvider::~CellTextProvider() +{ +} + +sal_Int32 CellTextProvider::getTextCount() const +{ + return 1; +} + +SdrText* CellTextProvider::getText(sal_Int32 nIndex) const +{ + (void) nIndex; + assert(nIndex == 0); + return m_xCell.get(); +} + +} + namespace sdr { namespace properties @@ -109,6 +149,8 @@ namespace sdr // create a new itemset SfxItemSet& CreateObjectSpecificItemSet(SfxItemPool& rPool); + const svx::ITextProvider& getTextProvider() const; + public: // basic constructor CellProperties(SdrObject& rObj, sdr::table::Cell* pCell ); @@ -131,6 +173,9 @@ namespace sdr void SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr); sdr::table::CellRef mxCell; + + private: + const CellTextProvider maTextProvider; }; // create a new itemset @@ -153,15 +198,22 @@ namespace sdr 0, 0)); } + const svx::ITextProvider& CellProperties::getTextProvider() const + { + return maTextProvider; + } + CellProperties::CellProperties(SdrObject& rObj, sdr::table::Cell* pCell) : TextProperties(rObj) , mxCell(pCell) + , maTextProvider(mxCell) { } CellProperties::CellProperties(const CellProperties& rProps, SdrObject& rObj, sdr::table::Cell* pCell) : TextProperties(rProps, rObj) , mxCell( pCell ) + , maTextProvider(mxCell) { } commit e3ad376f601d3abfc1b9e47dc0419d52785bd9b9 Author: David Tardon <[email protected]> Date: Wed Mar 20 11:11:44 2013 +0100 drop unused includes Change-Id: I819539b372d33cc8982a01d7bb72093cedb6461f diff --git a/svx/inc/svx/sdr/contact/displayinfo.hxx b/svx/inc/svx/sdr/contact/displayinfo.hxx index 88ccd81..6c4b85e 100644 --- a/svx/inc/svx/sdr/contact/displayinfo.hxx +++ b/svx/inc/svx/sdr/contact/displayinfo.hxx @@ -20,24 +20,10 @@ #ifndef _SDR_CONTACT_DISPLAYINFO_HXX #define _SDR_CONTACT_DISPLAYINFO_HXX -#include <sal/types.h> #include <svx/svdsob.hxx> -#include <svtools/colorcfg.hxx> #include <vcl/region.hxx> -#include <vector> #include "svx/svxdllapi.h" -////////////////////////////////////////////////////////////////////////////// -// predeclarations - -class SdrPage; - -namespace sdr { namespace contact { - class ViewObjectContact; -}} - -////////////////////////////////////////////////////////////////////////////// - namespace sdr { namespace contact diff --git a/svx/source/sdr/contact/displayinfo.cxx b/svx/source/sdr/contact/displayinfo.cxx index 004dca2..72d7aa7 100644 --- a/svx/source/sdr/contact/displayinfo.cxx +++ b/svx/source/sdr/contact/displayinfo.cxx @@ -18,12 +18,6 @@ */ #include <svx/sdr/contact/displayinfo.hxx> -#include <vcl/outdev.hxx> -#include <vcl/svapp.hxx> -#include <svx/svdobj.hxx> -#include <vcl/gdimtf.hxx> -#include <svx/svdpagv.hxx> -#include <svx/svdview.hxx> ////////////////////////////////////////////////////////////////////////////// diff --git a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx index 729abfd..e830bf8 100644 --- a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx +++ b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx @@ -18,6 +18,8 @@ */ +#include <svtools/colorcfg.hxx> + #include <svx/sdr/contact/viewobjectcontactofpageobj.hxx> #include <svx/sdr/contact/viewcontactofpageobj.hxx> #include <svx/svdopage.hxx> commit 8d8868a827e0daf3edd3f69a2c22cc185a7d496c Author: David Tardon <[email protected]> Date: Wed Mar 20 06:47:39 2013 +0100 drop unused member var Change-Id: I68004a90cbfdf6bf6c5b09998406a5479e5c50d6 diff --git a/reportdesign/source/core/sdr/RptModel.cxx b/reportdesign/source/core/sdr/RptModel.cxx index 47b0b6c..98cba0d 100644 --- a/reportdesign/source/core/sdr/RptModel.cxx +++ b/reportdesign/source/core/sdr/RptModel.cxx @@ -57,7 +57,6 @@ OReportModel::OReportModel(::reportdesign::OReportDefinition* _pReportDefinition ,m_pReportDefinition(_pReportDefinition) { DBG_CTOR( rpt_OReportModel,0); - SetAllowShapePropertyChangeListener(true); m_pUndoEnv = new OXUndoEnvironment(*this); m_pUndoEnv->acquire(); SetSdrUndoFactory(new OReportUndoFactory); diff --git a/svx/inc/svx/svdmodel.hxx b/svx/inc/svx/svdmodel.hxx index 739028d..f8fbf82 100644 --- a/svx/inc/svx/svdmodel.hxx +++ b/svx/inc/svx/svdmodel.hxx @@ -233,9 +233,6 @@ public: // for import void SetUniqueCommentID(sal_uInt32 nNewID) { if(nNewID != mnUniqueCommentID) { mnUniqueCommentID = nNewID; } } - /** cl: added this for OJ to complete his reporting engine, does not work - correctly so only enable it for his model */ - void SetAllowShapePropertyChangeListener( bool bAllow ); sal_uInt16 nStarDrawPreviewMasterPageNum; SvxForbiddenCharactersTable* mpForbiddenCharactersTable; diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 2ea9027..c6bc6f4 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -98,7 +98,6 @@ struct SdrModelImpl { SfxUndoManager* mpUndoManager; SdrUndoFactory* mpUndoFactory; - bool mbAllowShapePropertyChangeListener; }; //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -111,7 +110,6 @@ void SdrModel::ImpCtor(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* _pEmbe mpImpl = new SdrModelImpl; mpImpl->mpUndoManager=0; mpImpl->mpUndoFactory=0; - mpImpl->mbAllowShapePropertyChangeListener = false; mbInDestruction = false; aObjUnit=SdrEngineDefaults::GetMapFraction(); eObjUnit=SdrEngineDefaults::GetMapUnit(); @@ -2063,16 +2061,6 @@ void SdrModel::SetSdrUndoFactory( SdrUndoFactory* pUndoFactory ) } } -/* added for the reporting engine, but does not work - correctly, so only enable it for this model */ -void SdrModel::SetAllowShapePropertyChangeListener( bool bAllow ) -{ - if( mpImpl ) - { - mpImpl->mbAllowShapePropertyChangeListener = bAllow; - } -} - namespace { class theSdrModelUnoTunnelImplementationId : public rtl::Static< UnoTunnelIdInit, theSdrModelUnoTunnelImplementationId > {}; commit 6a08c0cba41dc63acb2c22c48170b081cc99e46c Author: David Tardon <[email protected]> Date: Mon Mar 18 15:52:42 2013 +0100 broadcast change if removing NULL page Change-Id: Iacf5e9cc509e29aaf5dd1321407c0de9db7677f3 diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 6bddfb3..2ea9027 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -1486,12 +1486,14 @@ SdrPage* SdrModel::RemovePage(sal_uInt16 nPgNum) void SdrModel::MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos) { SdrPage* pPg=maPages[nPgNum]; - maPages.erase(maPages.begin()+nPgNum); - PageListChanged(); if (pPg!=NULL) { + maPages.erase(maPages.begin()+nPgNum); // shortcut to avoid two broadcasts + PageListChanged(); pPg->SetInserted(sal_False); InsertPage(pPg,nNewPos); } + else + RemovePage(nPgNum); } void SdrModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
