| /************************************************************** |
| * |
| * 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_sc.hxx" |
| |
| // INCLUDE --------------------------------------------------------------- |
| |
| #include "scitems.hxx" |
| #include <editeng/eeitem.hxx> |
| |
| #include <sot/exchange.hxx> |
| #include <editeng/akrnitem.hxx> |
| #include <editeng/fontitem.hxx> |
| #include <editeng/forbiddencharacterstable.hxx> |
| #include <editeng/langitem.hxx> |
| #include <svx/svdetc.hxx> |
| #include <svx/svditer.hxx> |
| #include <svx/svdocapt.hxx> |
| #include <svx/svdograf.hxx> |
| #include <svx/svdoole2.hxx> |
| #include <svx/svdouno.hxx> |
| #include <svx/svdpage.hxx> |
| #include <svx/svdundo.hxx> |
| #include <svx/xtable.hxx> |
| #include <sfx2/objsh.hxx> |
| #include <sfx2/printer.hxx> |
| #include <unotools/saveopt.hxx> |
| #include <unotools/pathoptions.hxx> |
| |
| #include "document.hxx" |
| #include "docoptio.hxx" |
| #include "table.hxx" |
| #include "drwlayer.hxx" |
| #include "markdata.hxx" |
| #include "patattr.hxx" |
| #include "rechead.hxx" |
| #include "poolhelp.hxx" |
| #include "docpool.hxx" |
| #include "detfunc.hxx" // for UpdateAllComments |
| #include "editutil.hxx" |
| #include "postit.hxx" |
| #include "charthelper.hxx" |
| |
| using namespace ::com::sun::star; |
| #include <stdio.h> |
| // ----------------------------------------------------------------------- |
| |
| |
| SfxBroadcaster* ScDocument::GetDrawBroadcaster() |
| { |
| return pDrawLayer; |
| } |
| |
| void ScDocument::BeginDrawUndo() |
| { |
| if (pDrawLayer) |
| pDrawLayer->BeginCalcUndo(false); |
| } |
| |
| sal_Bool ScDocument::IsDrawRecording() const |
| { |
| return pDrawLayer ? pDrawLayer->IsRecording() : sal_False; |
| } |
| |
| void ScDocument::EndDrawUndo() |
| { |
| if( pDrawLayer ) |
| delete pDrawLayer->GetCalcUndo(); |
| } |
| |
| XColorListSharedPtr ScDocument::GetColorTable() |
| { |
| if (pDrawLayer) |
| return pDrawLayer->GetColorTableFromSdrModel(); |
| else |
| { |
| if (!maColorTable.get()) |
| { |
| SvtPathOptions aPathOpt; |
| maColorTable = XPropertyListFactory::CreateSharedXColorList(aPathOpt.GetPalettePath()); |
| } |
| |
| return maColorTable; |
| } |
| } |
| |
| void ScDocument::TransferDrawPage(ScDocument* pSrcDoc, SCTAB nSrcPos, SCTAB nDestPos) |
| { |
| if (pDrawLayer && pSrcDoc->pDrawLayer) |
| { |
| SdrPage* pOldPage = pSrcDoc->pDrawLayer->GetPage(static_cast<sal_uInt16>(nSrcPos)); |
| SdrPage* pNewPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nDestPos)); |
| |
| if (pOldPage && pNewPage) |
| { |
| SdrObjListIter aIter( *pOldPage, IM_FLAT ); |
| SdrObject* pOldObject = aIter.Next(); |
| while (pOldObject) |
| { |
| // #i112034# do not copy internal objects (detective) and note captions |
| if ( pOldObject->GetLayer() != SC_LAYER_INTERN && !ScDrawLayer::IsNoteCaption( pOldObject ) ) |
| { |
| // #116235# |
| SdrObject* pNewObject = pOldObject->Clone(); |
| // SdrObject* pNewObject = pOldObject->Clone( pNewPage, pDrawLayer ); |
| pNewObject->SetModel(pDrawLayer); |
| pNewObject->SetPage(pNewPage); |
| |
| pNewObject->NbcMove(Size(0,0)); |
| pNewPage->InsertObject( pNewObject ); |
| |
| if (pDrawLayer->IsRecording()) |
| pDrawLayer->AddCalcUndo< SdrUndoInsertObj >( *pNewObject ); |
| } |
| |
| pOldObject = aIter.Next(); |
| } |
| } |
| } |
| |
| // #71726# make sure the data references of charts are adapted |
| // (this must be after InsertObject!) |
| ScChartHelper::AdjustRangesOfChartsOnDestinationPage( pSrcDoc, this, nSrcPos, nDestPos ); |
| ScChartHelper::UpdateChartsOnDestinationPage(this, nDestPos); |
| } |
| |
| void ScDocument::InitDrawLayer( SfxObjectShell* pDocShell ) |
| { |
| if (pDocShell && !pShell) |
| pShell = pDocShell; |
| |
| // DBG_ASSERT(pShell,"InitDrawLayer ohne Shell"); |
| |
| if (!pDrawLayer) |
| { |
| String aName; |
| if ( pShell && !pShell->IsLoading() ) // #88438# don't call GetTitle while loading |
| aName = pShell->GetTitle(); |
| pDrawLayer = new ScDrawLayer( this, aName ); |
| if (GetLinkManager()) |
| pDrawLayer->SetLinkManager( pLinkManager ); |
| |
| // Drawing pages are accessed by table number, so they must also be present |
| // for preceding table numbers, even if the tables aren't allocated |
| // (important for clipboard documents). |
| |
| SCTAB nDrawPages = 0; |
| SCTAB nTab; |
| for (nTab=0; nTab<=MAXTAB; nTab++) |
| if (pTab[nTab]) |
| nDrawPages = nTab + 1; // needed number of pages |
| |
| for (nTab=0; nTab<nDrawPages; nTab++) |
| { |
| pDrawLayer->ScAddPage( nTab ); // always add page, with or without the table |
| if (pTab[nTab]) |
| { |
| String aTabName; |
| pTab[nTab]->GetName(aTabName); |
| pDrawLayer->ScRenamePage( nTab, aTabName ); |
| |
| pTab[nTab]->SetDrawPageSize(false,false); // #54782# set the right size immediately |
| #if 0 |
| sal_uLong nx = (sal_uLong) ((double) (MAXCOL+1) * STD_COL_WIDTH * HMM_PER_TWIPS ); |
| sal_uLong ny = (sal_uLong) ((double) (MAXROW+1) * ScGlobal::nStdRowHeight * HMM_PER_TWIPS ); |
| pDrawLayer->SetPageSize( nTab, Size( nx, ny ) ); |
| #endif |
| } |
| } |
| |
| pDrawLayer->SetDefaultTabulator( GetDocOptions().GetTabDistance() ); |
| |
| UpdateDrawPrinter(); |
| |
| // set draw defaults directly |
| SfxItemPool& rDrawPool = pDrawLayer->GetItemPool(); |
| rDrawPool.SetPoolDefaultItem( SvxAutoKernItem( sal_True, EE_CHAR_PAIRKERNING ) ); |
| |
| UpdateDrawLanguages(); |
| if (bImportingXML) |
| pDrawLayer->EnableAdjust(sal_False); |
| |
| if( IsImportingMSXML( ) ) |
| pDrawLayer->SetUndoAllowed( false ); |
| |
| pDrawLayer->SetForbiddenCharsTable( xForbiddenCharacters ); |
| pDrawLayer->SetCharCompressType( GetAsianCompression() ); |
| pDrawLayer->SetKernAsianPunctuation( GetAsianKerning() ); |
| } |
| } |
| |
| void ScDocument::UpdateDrawLanguages() |
| { |
| if (pDrawLayer) |
| { |
| SfxItemPool& rDrawPool = pDrawLayer->GetItemPool(); |
| rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eLanguage, EE_CHAR_LANGUAGE ) ); |
| rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eCjkLanguage, EE_CHAR_LANGUAGE_CJK ) ); |
| rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eCtlLanguage, EE_CHAR_LANGUAGE_CTL ) ); |
| } |
| } |
| |
| void ScDocument::UpdateDrawPrinter() |
| { |
| if (pDrawLayer) |
| { |
| // use the printer even if IsValid is false |
| // Application::GetDefaultDevice causes trouble with changing MapModes |
| |
| // OutputDevice* pRefDev = GetPrinter(); |
| // pRefDev->SetMapMode( MAP_100TH_MM ); |
| pDrawLayer->SetRefDevice(GetRefDevice()); |
| } |
| } |
| |
| sal_Bool ScDocument::IsChart( const SdrObject* pObject ) |
| { |
| // #109985# |
| // IsChart() implementation moved to svx drawinglayer |
| if(pObject && OBJ_OLE2 == pObject->GetObjIdentifier()) |
| { |
| return ((SdrOle2Obj*)pObject)->IsChart(); |
| } |
| |
| return sal_False; |
| } |
| |
| IMPL_LINK_INLINE_START( ScDocument, GetUserDefinedColor, sal_uInt16 *, pColorIndex ) |
| { |
| return (long) &((GetColorTable()->GetColor(*pColorIndex))->GetColor()); |
| } |
| IMPL_LINK_INLINE_END( ScDocument, GetUserDefinedColor, sal_uInt16 *, pColorIndex ) |
| |
| void ScDocument::DeleteDrawLayer() |
| { |
| delete pDrawLayer; |
| } |
| |
| sal_Bool ScDocument::DrawGetPrintArea( ScRange& rRange, sal_Bool bSetHor, sal_Bool bSetVer ) const |
| { |
| return pDrawLayer->GetPrintArea( rRange, bSetHor, bSetVer ); |
| } |
| |
| void ScDocument::DrawMovePage( sal_uInt16 nOldPos, sal_uInt16 nNewPos ) |
| { |
| pDrawLayer->ScMovePage(nOldPos,nNewPos); |
| } |
| |
| void ScDocument::DrawCopyPage( sal_uInt16 nOldPos, sal_uInt16 nNewPos ) |
| { |
| // angelegt wird die Page schon im ScTable ctor |
| pDrawLayer->ScCopyPage( nOldPos, nNewPos, sal_False ); |
| } |
| |
| void ScDocument::DeleteObjectsInArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, |
| const ScMarkData& rMark ) |
| { |
| if (!pDrawLayer) |
| return; |
| |
| SCTAB nTabCount = GetTableCount(); |
| for (SCTAB nTab=0; nTab<=nTabCount; nTab++) |
| if (pTab[nTab] && rMark.GetTableSelect(nTab)) |
| pDrawLayer->DeleteObjectsInArea( nTab, nCol1, nRow1, nCol2, nRow2 ); |
| } |
| |
| void ScDocument::DeleteObjectsInSelection( const ScMarkData& rMark ) |
| { |
| if (!pDrawLayer) |
| return; |
| |
| pDrawLayer->DeleteObjectsInSelection( rMark ); |
| } |
| |
| sal_Bool ScDocument::HasOLEObjectsInArea( const ScRange& rRange, const ScMarkData* pTabMark ) |
| { |
| // pTabMark is used only for selected tables. If pTabMark is 0, all tables of rRange are used. |
| |
| if (!pDrawLayer) |
| return sal_False; |
| |
| SCTAB nStartTab = 0; |
| SCTAB nEndTab = MAXTAB; |
| if ( !pTabMark ) |
| { |
| nStartTab = rRange.aStart.Tab(); |
| nEndTab = rRange.aEnd.Tab(); |
| } |
| |
| for (SCTAB nTab = nStartTab; nTab <= nEndTab; nTab++) |
| { |
| if ( !pTabMark || pTabMark->GetTableSelect(nTab) ) |
| { |
| Rectangle aMMRect = GetMMRect( rRange.aStart.Col(), rRange.aStart.Row(), |
| rRange.aEnd.Col(), rRange.aEnd.Row(), nTab ); |
| |
| SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); |
| DBG_ASSERT(pPage,"Page ?"); |
| if (pPage) |
| { |
| SdrObjListIter aIter( *pPage, IM_FLAT ); |
| SdrObject* pObject = aIter.Next(); |
| while (pObject) |
| { |
| if ( pObject->GetObjIdentifier() == OBJ_OLE2 && |
| aMMRect.IsInside( pObject->GetCurrentBoundRect() ) ) |
| return sal_True; |
| |
| pObject = aIter.Next(); |
| } |
| } |
| } |
| } |
| |
| return sal_False; |
| } |
| |
| |
| void ScDocument::StartAnimations( SCTAB nTab, Window* pWin ) |
| { |
| if (!pDrawLayer) |
| return; |
| SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); |
| DBG_ASSERT(pPage,"Page ?"); |
| if (!pPage) |
| return; |
| |
| SdrObjListIter aIter( *pPage, IM_FLAT ); |
| SdrObject* pObject = aIter.Next(); |
| while (pObject) |
| { |
| if (pObject->ISA(SdrGrafObj)) |
| { |
| SdrGrafObj* pGrafObj = (SdrGrafObj*)pObject; |
| if ( pGrafObj->IsAnimated() ) |
| { |
| const Rectangle& rRect = pGrafObj->GetCurrentBoundRect(); |
| pGrafObj->StartAnimation( pWin, rRect.TopLeft(), rRect.GetSize() ); |
| } |
| } |
| pObject = aIter.Next(); |
| } |
| } |
| |
| //UNUSED2008-05 void ScDocument::RefreshNoteFlags() |
| //UNUSED2008-05 { |
| //UNUSED2008-05 if (!pDrawLayer) |
| //UNUSED2008-05 return; |
| //UNUSED2008-05 |
| //UNUSED2008-05 sal_Bool bAnyIntObj = sal_False; |
| //UNUSED2008-05 SCTAB nTab; |
| //UNUSED2008-05 ScPostIt aNote(this); |
| //UNUSED2008-05 for (nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); |
| //UNUSED2008-05 DBG_ASSERT(pPage,"Page ?"); |
| //UNUSED2008-05 if (pPage) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 SdrObjListIter aIter( *pPage, IM_FLAT ); |
| //UNUSED2008-05 SdrObject* pObject = aIter.Next(); |
| //UNUSED2008-05 while (pObject) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 if ( pObject->GetLayer() == SC_LAYER_INTERN ) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 bAnyIntObj = sal_True; // for all internal objects, including detective |
| //UNUSED2008-05 |
| //UNUSED2008-05 if ( pObject->ISA( SdrCaptionObj ) ) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 ScDrawObjData* pData = ScDrawLayer::GetObjData( pObject ); |
| //UNUSED2008-05 if ( pData ) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 if ( GetNote( pData->aStt.Col(), pData->aStt.Row(), nTab, aNote)) |
| //UNUSED2008-05 if ( !aNote.IsShown() ) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 aNote.SetShown(sal_True); |
| //UNUSED2008-05 SetNote( pData->aStt.Col(), pData->aStt.Row(), nTab, aNote); |
| //UNUSED2008-05 } |
| //UNUSED2008-05 } |
| //UNUSED2008-05 } |
| //UNUSED2008-05 } |
| //UNUSED2008-05 pObject = aIter.Next(); |
| //UNUSED2008-05 } |
| //UNUSED2008-05 } |
| //UNUSED2008-05 } |
| //UNUSED2008-05 |
| //UNUSED2008-05 if (bAnyIntObj) |
| //UNUSED2008-05 { |
| //UNUSED2008-05 // update attributes for all note objects and the colors of detective objects |
| //UNUSED2008-05 // (we don't know with which settings the file was created) |
| //UNUSED2008-05 |
| //UNUSED2008-05 ScDetectiveFunc aFunc( this, 0 ); |
| //UNUSED2008-05 aFunc.UpdateAllComments(); |
| //UNUSED2008-05 aFunc.UpdateAllArrowColors(); |
| //UNUSED2008-05 } |
| //UNUSED2008-05 } |
| |
| sal_Bool ScDocument::HasBackgroundDraw( SCTAB nTab, const Rectangle& rMMRect ) |
| { |
| // Gibt es Objekte auf dem Hintergrund-Layer, die (teilweise) von rMMRect |
| // betroffen sind? |
| // (fuer Drawing-Optimierung, vor dem Hintergrund braucht dann nicht geloescht |
| // zu werden) |
| |
| if (!pDrawLayer) |
| return sal_False; |
| SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); |
| DBG_ASSERT(pPage,"Page ?"); |
| if (!pPage) |
| return sal_False; |
| |
| sal_Bool bFound = sal_False; |
| |
| SdrObjListIter aIter( *pPage, IM_FLAT ); |
| SdrObject* pObject = aIter.Next(); |
| while (pObject && !bFound) |
| { |
| if ( pObject->GetLayer() == SC_LAYER_BACK && pObject->GetCurrentBoundRect().IsOver( rMMRect ) ) |
| bFound = sal_True; |
| pObject = aIter.Next(); |
| } |
| |
| return bFound; |
| } |
| |
| sal_Bool ScDocument::HasAnyDraw( SCTAB nTab, const Rectangle& rMMRect ) |
| { |
| // Gibt es ueberhaupt Objekte, die (teilweise) von rMMRect |
| // betroffen sind? |
| // (um leere Seiten beim Drucken zu erkennen) |
| |
| if (!pDrawLayer) |
| return sal_False; |
| SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); |
| DBG_ASSERT(pPage,"Page ?"); |
| if (!pPage) |
| return sal_False; |
| |
| sal_Bool bFound = sal_False; |
| |
| SdrObjListIter aIter( *pPage, IM_FLAT ); |
| SdrObject* pObject = aIter.Next(); |
| while (pObject && !bFound) |
| { |
| if ( pObject->GetCurrentBoundRect().IsOver( rMMRect ) ) |
| bFound = sal_True; |
| pObject = aIter.Next(); |
| } |
| |
| return bFound; |
| } |
| |
| void ScDocument::EnsureGraphicNames() |
| { |
| if (pDrawLayer) |
| pDrawLayer->EnsureGraphicNames(); |
| } |
| |
| SdrObject* ScDocument::GetObjectAtPoint( SCTAB nTab, const Point& rPos ) |
| { |
| // fuer Drag&Drop auf Zeichenobjekt |
| |
| SdrObject* pFound = NULL; |
| if (pDrawLayer && pTab[nTab]) |
| { |
| SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); |
| DBG_ASSERT(pPage,"Page ?"); |
| if (pPage) |
| { |
| SdrObjListIter aIter( *pPage, IM_FLAT ); |
| SdrObject* pObject = aIter.Next(); |
| while (pObject) |
| { |
| if ( pObject->GetCurrentBoundRect().IsInside(rPos) ) |
| { |
| // Intern interessiert gar nicht |
| // Objekt vom Back-Layer nur, wenn kein Objekt von anderem Layer getroffen |
| |
| SdrLayerID nLayer = pObject->GetLayer(); |
| if ( (nLayer != SC_LAYER_INTERN) && (nLayer != SC_LAYER_HIDDEN) ) |
| { |
| if ( nLayer != SC_LAYER_BACK || |
| !pFound || pFound->GetLayer() == SC_LAYER_BACK ) |
| { |
| pFound = pObject; |
| } |
| } |
| } |
| // weitersuchen -> letztes (oberstes) getroffenes Objekt nehmen |
| |
| pObject = aIter.Next(); |
| } |
| } |
| } |
| return pFound; |
| } |
| |
| sal_Bool ScDocument::IsPrintEmpty( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, |
| SCCOL nEndCol, SCROW nEndRow, sal_Bool bLeftIsEmpty, |
| ScRange* pLastRange, Rectangle* pLastMM ) const |
| { |
| if (!IsBlockEmpty( nTab, nStartCol, nStartRow, nEndCol, nEndRow )) |
| return sal_False; |
| |
| ScDocument* pThis = (ScDocument*)this; //! GetMMRect / HasAnyDraw etc. const !!! |
| |
| Rectangle aMMRect; |
| if ( pLastRange && pLastMM && nTab == pLastRange->aStart.Tab() && |
| nStartRow == pLastRange->aStart.Row() && nEndRow == pLastRange->aEnd.Row() ) |
| { |
| // keep vertical part of aMMRect, only update horizontal position |
| aMMRect = *pLastMM; |
| |
| long nLeft = 0; |
| SCCOL i; |
| for (i=0; i<nStartCol; i++) |
| nLeft += GetColWidth(i,nTab); |
| long nRight = nLeft; |
| for (i=nStartCol; i<=nEndCol; i++) |
| nRight += GetColWidth(i,nTab); |
| |
| aMMRect.Left() = (long)(nLeft * HMM_PER_TWIPS); |
| aMMRect.Right() = (long)(nRight * HMM_PER_TWIPS); |
| } |
| else |
| aMMRect = pThis->GetMMRect( nStartCol, nStartRow, nEndCol, nEndRow, nTab ); |
| |
| if ( pLastRange && pLastMM ) |
| { |
| *pLastRange = ScRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab ); |
| *pLastMM = aMMRect; |
| } |
| |
| if ( pThis->HasAnyDraw( nTab, aMMRect )) |
| return sal_False; |
| |
| if ( nStartCol > 0 && !bLeftIsEmpty ) |
| { |
| // aehnlich wie in ScPrintFunc::AdjustPrintArea |
| //! ExtendPrintArea erst ab Start-Spalte des Druckbereichs |
| |
| SCCOL nExtendCol = nStartCol - 1; |
| SCROW nTmpRow = nEndRow; |
| |
| pThis->ExtendMerge( 0,nStartRow, nExtendCol,nTmpRow, nTab, |
| sal_False, sal_True ); // kein Refresh, incl. Attrs |
| |
| OutputDevice* pDev = pThis->GetPrinter(); |
| pDev->SetMapMode( MAP_PIXEL ); // wichtig fuer GetNeededSize |
| pThis->ExtendPrintArea( pDev, nTab, 0, nStartRow, nExtendCol, nEndRow ); |
| if ( nExtendCol >= nStartCol ) |
| return sal_False; |
| } |
| |
| return sal_True; |
| } |
| |
| void ScDocument::Clear( sal_Bool bFromDestructor ) |
| { |
| for (SCTAB i=0; i<=MAXTAB; i++) |
| if (pTab[i]) |
| { |
| delete pTab[i]; |
| pTab[i]=NULL; |
| } |
| delete pSelectionAttr; |
| pSelectionAttr = NULL; |
| |
| if (pDrawLayer) |
| { |
| // #116168# |
| //pDrawLayer->Clear(); |
| pDrawLayer->ClearModel( bFromDestructor ); |
| } |
| } |
| |
| sal_Bool ScDocument::HasControl( SCTAB nTab, const Rectangle& rMMRect ) |
| { |
| sal_Bool bFound = sal_False; |
| |
| if (pDrawLayer) |
| { |
| SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); |
| DBG_ASSERT(pPage,"Page ?"); |
| if (pPage) |
| { |
| SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); |
| SdrObject* pObject = aIter.Next(); |
| while (pObject && !bFound) |
| { |
| if (pObject->ISA(SdrUnoObj)) |
| { |
| Rectangle aObjRect = pObject->GetLogicRect(); |
| if ( aObjRect.IsOver( rMMRect ) ) |
| bFound = sal_True; |
| } |
| |
| pObject = aIter.Next(); |
| } |
| } |
| } |
| |
| return bFound; |
| } |
| |
| void ScDocument::InvalidateControls( Window* pWin, SCTAB nTab, const Rectangle& rMMRect ) |
| { |
| if (pDrawLayer) |
| { |
| SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); |
| DBG_ASSERT(pPage,"Page ?"); |
| if (pPage) |
| { |
| SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); |
| SdrObject* pObject = aIter.Next(); |
| while (pObject) |
| { |
| if (pObject->ISA(SdrUnoObj)) |
| { |
| Rectangle aObjRect = pObject->GetLogicRect(); |
| if ( aObjRect.IsOver( rMMRect ) ) |
| { |
| // Uno-Controls zeichnen sich immer komplett, ohne Ruecksicht |
| // auf ClippingRegions. Darum muss das ganze Objekt neu gepainted |
| // werden, damit die Selektion auf der Tabelle nicht uebermalt wird. |
| |
| //pWin->Invalidate( aObjRect.GetIntersection( rMMRect ) ); |
| pWin->Invalidate( aObjRect ); |
| } |
| } |
| |
| pObject = aIter.Next(); |
| } |
| } |
| } |
| } |
| |
| sal_Bool ScDocument::HasDetectiveObjects(SCTAB nTab) const |
| { |
| // looks for detective objects, annotations don't count |
| // (used to adjust scale so detective objects hit their cells better) |
| |
| sal_Bool bFound = sal_False; |
| |
| if (pDrawLayer) |
| { |
| SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); |
| DBG_ASSERT(pPage,"Page ?"); |
| if (pPage) |
| { |
| SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); |
| SdrObject* pObject = aIter.Next(); |
| while (pObject && !bFound) |
| { |
| // anything on the internal layer except captions (annotations) |
| if ( (pObject->GetLayer() == SC_LAYER_INTERN) && !ScDrawLayer::IsNoteCaption( pObject ) ) |
| bFound = sal_True; |
| |
| pObject = aIter.Next(); |
| } |
| } |
| } |
| |
| return bFound; |
| } |
| |
| void ScDocument::UpdateFontCharSet() |
| { |
| // In alten Versionen (bis incl. 4.0 ohne SP) wurden beim Austausch zwischen |
| // Systemen die CharSets in den Font-Attributen nicht angepasst. |
| // Das muss fuer Dokumente bis incl SP2 nun nachgeholt werden: |
| // Alles, was nicht SYMBOL ist, wird auf den System-CharSet umgesetzt. |
| // Bei neuen Dokumenten (Version SC_FONTCHARSET) sollte der CharSet stimmen. |
| |
| sal_Bool bUpdateOld = ( nSrcVer < SC_FONTCHARSET ); |
| |
| CharSet eSysSet = gsl_getSystemTextEncoding(); |
| if ( eSrcSet != eSysSet || bUpdateOld ) |
| { |
| sal_uInt32 nCount,i; |
| SvxFontItem* pItem; |
| |
| ScDocumentPool* pPool = xPoolHelper->GetDocPool(); |
| nCount = pPool->GetItemCount2(ATTR_FONT); |
| for (i=0; i<nCount; i++) |
| { |
| pItem = (SvxFontItem*)pPool->GetItem2(ATTR_FONT, i); |
| if ( pItem && ( pItem->GetCharSet() == eSrcSet || |
| ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) ) |
| pItem->SetCharSet(eSysSet); |
| } |
| |
| if ( pDrawLayer ) |
| { |
| SfxItemPool& rDrawPool = pDrawLayer->GetItemPool(); |
| nCount = rDrawPool.GetItemCount2(EE_CHAR_FONTINFO); |
| for (i=0; i<nCount; i++) |
| { |
| pItem = (SvxFontItem*)rDrawPool.GetItem2(EE_CHAR_FONTINFO, i); |
| if ( pItem && ( pItem->GetCharSet() == eSrcSet || |
| ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) ) |
| pItem->SetCharSet( eSysSet ); |
| } |
| } |
| } |
| } |
| |
| void ScDocument::SetLoadingMedium( bool bVal ) |
| { |
| bLoadingMedium = bVal; |
| for (SCTAB nTab = 0; nTab <= MAXTAB; ++nTab) |
| { |
| if (!pTab[nTab]) |
| return; |
| |
| pTab[nTab]->SetLoadingMedium(bVal); |
| } |
| } |
| |
| void ScDocument::SetImportingXML( bool bVal ) |
| { |
| bImportingXML = bVal; |
| if (pDrawLayer) |
| pDrawLayer->EnableAdjust(!bImportingXML); |
| |
| if ( !bVal ) |
| { |
| // #i57869# after loading, do the real RTL mirroring for the sheets that have the LoadingRTL flag set |
| |
| for ( SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++ ) |
| if ( pTab[nTab]->IsLoadingRTL() ) |
| { |
| pTab[nTab]->SetLoadingRTL( sal_False ); |
| SetLayoutRTL( nTab, sal_True ); // includes mirroring; bImportingXML must be cleared first |
| } |
| } |
| |
| SetLoadingMedium(bVal); |
| } |
| |
| void ScDocument::SetImportingMSXML( bool bVal ) |
| { |
| mbImportingMSXML = bVal; |
| |
| if (pDrawLayer) |
| pDrawLayer->SetUndoAllowed( !mbImportingMSXML ); |
| } |
| |
| void ScDocument::SetXMLFromWrapper( sal_Bool bVal ) |
| { |
| bXMLFromWrapper = bVal; |
| } |
| |
| vos::ORef<SvxForbiddenCharactersTable> ScDocument::GetForbiddenCharacters() |
| { |
| return xForbiddenCharacters; |
| } |
| |
| void ScDocument::SetForbiddenCharacters( const vos::ORef<SvxForbiddenCharactersTable> xNew ) |
| { |
| xForbiddenCharacters = xNew; |
| if ( pEditEngine ) |
| pEditEngine->SetForbiddenCharsTable( xForbiddenCharacters ); |
| if ( pDrawLayer ) |
| pDrawLayer->SetForbiddenCharsTable( xForbiddenCharacters ); |
| } |
| |
| sal_Bool ScDocument::IsValidAsianCompression() const |
| { |
| return ( nAsianCompression != SC_ASIANCOMPRESSION_INVALID ); |
| } |
| |
| sal_uInt8 ScDocument::GetAsianCompression() const |
| { |
| if ( nAsianCompression == SC_ASIANCOMPRESSION_INVALID ) |
| return 0; |
| else |
| return nAsianCompression; |
| } |
| |
| void ScDocument::SetAsianCompression(sal_uInt8 nNew) |
| { |
| nAsianCompression = nNew; |
| if ( pEditEngine ) |
| pEditEngine->SetAsianCompressionMode( nAsianCompression ); |
| if ( pDrawLayer ) |
| pDrawLayer->SetCharCompressType( nAsianCompression ); |
| } |
| |
| sal_Bool ScDocument::IsValidAsianKerning() const |
| { |
| return ( nAsianKerning != SC_ASIANKERNING_INVALID ); |
| } |
| |
| sal_Bool ScDocument::GetAsianKerning() const |
| { |
| if ( nAsianKerning == SC_ASIANKERNING_INVALID ) |
| return sal_False; |
| else |
| return (sal_Bool)nAsianKerning; |
| } |
| |
| void ScDocument::SetAsianKerning(sal_Bool bNew) |
| { |
| nAsianKerning = (sal_uInt8)bNew; |
| if ( pEditEngine ) |
| pEditEngine->SetKernAsianPunctuation( (sal_Bool)nAsianKerning ); |
| if ( pDrawLayer ) |
| pDrawLayer->SetKernAsianPunctuation( (sal_Bool)nAsianKerning ); |
| } |
| |
| void ScDocument::ApplyAsianEditSettings( ScEditEngineDefaulter& rEngine ) |
| { |
| rEngine.SetForbiddenCharsTable( xForbiddenCharacters ); |
| rEngine.SetAsianCompressionMode( GetAsianCompression() ); |
| rEngine.SetKernAsianPunctuation( GetAsianKerning() ); |
| } |
| |