diff options
Diffstat (limited to 'binfilter/bf_sc/source/core/data/sc_drwlayer.cxx')
-rw-r--r-- | binfilter/bf_sc/source/core/data/sc_drwlayer.cxx | 928 |
1 files changed, 928 insertions, 0 deletions
diff --git a/binfilter/bf_sc/source/core/data/sc_drwlayer.cxx b/binfilter/bf_sc/source/core/data/sc_drwlayer.cxx new file mode 100644 index 000000000000..0f09ef768ba3 --- /dev/null +++ b/binfilter/bf_sc/source/core/data/sc_drwlayer.cxx @@ -0,0 +1,928 @@ +/* -*- 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 + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifdef _MSC_VER +#pragma hdrstop +#endif + +// INCLUDE --------------------------------------------------------------- + + +#include "scitems.hxx" +#include <bf_svx/eeitem.hxx> +#define ITEMID_FIELD EE_FEATURE_FIELD + +#include <bf_svx/frmdiritem.hxx> +#include <bf_svx/objfac3d.hxx> +#include <bf_svx/svdoutl.hxx> +#include <bf_svx/svditer.hxx> +#include <bf_svx/svdoedge.hxx> +#include <bf_svx/svdoole2.hxx> +#include <bf_svx/svdundo.hxx> +#include <bf_svx/drawitem.hxx> +#include <bf_svx/fhgtitem.hxx> +#include <bf_sfx2/docfile.hxx> +#include <bf_svtools/pathoptions.hxx> +#include <bf_svtools/itempool.hxx> +#include <bf_offmgr/app.hxx> + +#include "drwlayer.hxx" +#include "drawpage.hxx" +#include "document.hxx" +#include "rechead.hxx" +#include "userdat.hxx" +#include "globstr.hrc" +#include "scmod.hxx" +namespace binfilter { + +#define DET_ARROW_OFFSET 1000 + +// Abstand zur naechsten Zelle beim Loeschen (bShrink), damit der Anker +// immer an der richtigen Zelle angezeigt wird +//#define SHRINK_DIST 3 +// und noch etwas mehr, damit das Objekt auch sichtbar in der Zelle liegt +#define SHRINK_DIST 25 + +#define SHRINK_DIST_TWIPS 15 + +// ----------------------------------------------------------------------- +// +// Das Anpassen der Detektiv-UserData muss zusammen mit den Draw-Undo's +// in der SdrUndoGroup liegen, darum von SdrUndoAction abgeleitet: + + +// ----------------------------------------------------------------------- + +// STATIC DATA ----------------------------------------------------------- + +/*N*/ TYPEINIT1(ScTabDeletedHint, SfxHint); +/*N*/ TYPEINIT1(ScTabSizeChangedHint, SfxHint); + +static ScDrawObjFactory* pFac = NULL; +static E3dObjFactory* pF3d = NULL; +static USHORT nInst = 0; + +SvPersist* ScDrawLayer::pGlobalDrawPersist = NULL; + +BOOL bDrawIsInUndo = FALSE; //! Member + +// ----------------------------------------------------------------------- + +/*N*/ __EXPORT ScTabDeletedHint::~ScTabDeletedHint() +/*N*/ { +/*N*/ } + +/*N*/ ScTabSizeChangedHint::ScTabSizeChangedHint( USHORT nTabNo ) : +/*N*/ nTab( nTabNo ) +/*N*/ { +/*N*/ } + +/*N*/ __EXPORT ScTabSizeChangedHint::~ScTabSizeChangedHint() +/*N*/ { +/*N*/ } + +// ----------------------------------------------------------------------- + +#define MAXMM 10000000 + +/*N*/ inline void TwipsToMM( long& nVal ) +/*N*/ { +/*N*/ nVal = (long) ( nVal * HMM_PER_TWIPS ); +/*N*/ } + +/*N*/ inline void ReverseTwipsToMM( long& nVal ) +/*N*/ { +/*N*/ // reverse the effect of TwipsToMM - round up here (add 1) +/*N*/ +/*N*/ nVal = ((long) ( nVal / HMM_PER_TWIPS )) + 1; +/*N*/ } + +/*N*/ void lcl_TwipsToMM( Point& rPoint ) +/*N*/ { +/*N*/ TwipsToMM( rPoint.X() ); +/*N*/ TwipsToMM( rPoint.Y() ); +/*N*/ } + +/*N*/ void lcl_ReverseTwipsToMM( Point& rPoint ) +/*N*/ { +/*N*/ ReverseTwipsToMM( rPoint.X() ); +/*N*/ ReverseTwipsToMM( rPoint.Y() ); +/*N*/ } + +/*N*/ void lcl_ReverseTwipsToMM( Rectangle& rRect ) +/*N*/ { +/*N*/ ReverseTwipsToMM( rRect.Left() ); +/*N*/ ReverseTwipsToMM( rRect.Right() ); +/*N*/ ReverseTwipsToMM( rRect.Top() ); +/*N*/ ReverseTwipsToMM( rRect.Bottom() ); +/*N*/ } + +// ----------------------------------------------------------------------- + + +/*N*/ ScDrawLayer::ScDrawLayer( ScDocument* pDocument, const String& rName ) : +/*N*/ FmFormModel( SvtPathOptions().GetPalettePath(), +/*N*/ NULL, // SfxItemPool* Pool +/*N*/ pGlobalDrawPersist ? +/*N*/ pGlobalDrawPersist : +/*N*/ ( pDocument ? pDocument->GetDocumentShell() : NULL ), +/*N*/ TRUE ), // bUseExtColorTable (is set below) +/*N*/ aName( rName ), +/*N*/ pDoc( pDocument ), +/*N*/ pUndoGroup( NULL ), +/*N*/ bRecording( FALSE ), +/*N*/ bAdjustEnabled( TRUE ), +/*N*/ bHyphenatorSet( FALSE ) +/*N*/ { +/*N*/ pGlobalDrawPersist = NULL; // nur einmal benutzen +/*N*/ +/*N*/ SfxObjectShell* pObjSh = pDocument ? pDocument->GetDocumentShell() : NULL; +/*N*/ if ( pObjSh ) +/*N*/ { +/*N*/ SetObjectShell( pObjSh ); +/*N*/ +/*N*/ // set color table +/*N*/ SvxColorTableItem* pColItem = (SvxColorTableItem*) pObjSh->GetItem( ITEMID_COLOR_TABLE ); +/*N*/ XColorTable* pXCol = pColItem ? pColItem->GetColorTable() : OFF_APP()->GetStdColorTable(); +/*N*/ SetColorTable( pXCol ); +/*N*/ } +/*N*/ else +/*?*/ SetColorTable( OFF_APP()->GetStdColorTable() ); +/*N*/ +/*N*/ SetSwapGraphics(TRUE); +/*N*/ // SetSwapAsynchron(TRUE); // an der View +/*N*/ +/*N*/ SetScaleUnit(MAP_100TH_MM); +/*N*/ SfxItemPool& rPool = GetItemPool(); +/*N*/ rPool.SetDefaultMetric(SFX_MAPUNIT_100TH_MM); +/*N*/ SvxFrameDirectionItem aModeItem( FRMDIR_ENVIRONMENT, EE_PARA_WRITINGDIR ); +/*N*/ rPool.SetPoolDefaultItem( aModeItem ); +/*N*/ rPool.FreezeIdRanges(); // der Pool wird auch direkt verwendet +/*N*/ +/*N*/ SdrLayerAdmin& rAdmin = GetLayerAdmin(); +/*N*/ rAdmin.NewLayer(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("vorne")), SC_LAYER_FRONT); +/*N*/ rAdmin.NewLayer(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("hinten")), SC_LAYER_BACK); +/*N*/ rAdmin.NewLayer(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("intern")), SC_LAYER_INTERN); +/*N*/ rAdmin.NewLayer(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Controls")), SC_LAYER_CONTROLS); +/*N*/ // "Controls" is new - must also be created when loading +/*N*/ +/*N*/ // Link fuer URL-Fields setzen +/*N*/ ScModule* pScMod = SC_MOD(); +/*N*/ Outliner& rOutliner = GetDrawOutliner(); +/*N*/ rOutliner.SetCalcFieldValueHdl( LINK( pScMod, ScModule, CalcFieldValueHdl ) ); +/*N*/ +/*N*/ Outliner& rHitOutliner = GetHitTestOutliner(); +/*N*/ rHitOutliner.SetCalcFieldValueHdl( LINK( pScMod, ScModule, CalcFieldValueHdl ) ); +/*N*/ +/*N*/ // #95129# SJ: set FontHeight pool defaults without changing static SdrEngineDefaults +/*N*/ SfxItemPool* pOutlinerPool = rOutliner.GetEditTextObjectPool(); +/*N*/ if ( pOutlinerPool ) +/*N*/ pItemPool->SetPoolDefaultItem(SvxFontHeightItem( 423, 100, EE_CHAR_FONTHEIGHT )); // 12Pt +/*N*/ SfxItemPool* pHitOutlinerPool = rHitOutliner.GetEditTextObjectPool(); +/*N*/ if ( pHitOutlinerPool ) +/*N*/ pHitOutlinerPool->SetPoolDefaultItem(SvxFontHeightItem( 423, 100, EE_CHAR_FONTHEIGHT )); // 12Pt +/*N*/ +/*N*/ // URL-Buttons haben keinen Handler mehr, machen alles selber +/*N*/ +/*N*/ if( !nInst++ ) +/*N*/ { +/*N*/ pFac = new ScDrawObjFactory; +/*N*/ pF3d = new E3dObjFactory; +/*N*/ } +/*N*/ } + +/*N*/ __EXPORT ScDrawLayer::~ScDrawLayer() +/*N*/ { +/*N*/ Broadcast(SdrHint(HINT_MODELCLEARED)); +/*N*/ +/*N*/ Clear(); +/*N*/ +/*N*/ delete pUndoGroup; +/*N*/ if( !--nInst ) +/*N*/ { +/*N*/ delete pFac, pFac = NULL; +/*N*/ delete pF3d, pF3d = NULL; +/*N*/ } +/*N*/ } + + +/*N*/ SdrPage* __EXPORT ScDrawLayer::AllocPage(FASTBOOL bMasterPage) +/*N*/ { +/*N*/ // don't create basic until it is needed +/*N*/ StarBASIC* pBasic = NULL; +/*N*/ ScDrawPage* pPage = new ScDrawPage( *this, pBasic, bMasterPage ); +/*N*/ return pPage; +/*N*/ } + + +/*N*/ void ScDrawLayer::UpdateBasic() +/*N*/ { +/*N*/ // don't create basic until it is needed +/*N*/ //! remove this method? +/*N*/ } + + + +/*N*/ void ScDrawLayer::ScAddPage( USHORT nTab ) +/*N*/ { +/*N*/ if (bDrawIsInUndo) +/*N*/ return; +/*N*/ +/*N*/ ScDrawPage* pPage = (ScDrawPage*)AllocPage( FALSE ); +/*N*/ InsertPage(pPage, nTab); +/*N*/ if (bRecording) +/*N*/ AddCalcUndo(new SdrUndoNewPage(*pPage)); +/*N*/ } + + +/*N*/ void ScDrawLayer::ScRenamePage( USHORT nTab, const String& rNewName ) +/*N*/ { +/*N*/ ScDrawPage* pPage = (ScDrawPage*) GetPage(nTab); +/*N*/ if (pPage) +/*N*/ pPage->SetName(rNewName); +/*N*/ } + + + + + +/*N*/ void ScDrawLayer::SetPageSize( USHORT nPageNo, const Size& rSize ) +/*N*/ { +/*N*/ SdrPage* pPage = GetPage(nPageNo); +/*N*/ if (pPage) +/*N*/ { +/*N*/ if ( rSize != pPage->GetSize() ) +/*N*/ { +/*N*/ pPage->SetSize( rSize ); +/*N*/ Broadcast( ScTabSizeChangedHint( nPageNo ) ); // SetWorkArea() an den Views +/*N*/ } +/*N*/ +/*N*/ // Detektivlinien umsetzen (an neue Hoehen/Breiten anpassen) +/*N*/ // auch wenn Groesse gleich geblieben ist +/*N*/ // (einzelne Zeilen/Spalten koennen geaendert sein) +/*N*/ +/*N*/ ULONG nCount = pPage->GetObjCount(); +/*N*/ for ( ULONG i = 0; i < nCount; i++ ) +/*N*/ { +/*N*/ SdrObject* pObj = pPage->GetObj( i ); +/*N*/ ScDrawObjData* pData = GetObjData( pObj ); +/*N*/ if( pData ) +DBG_BF_ASSERT(0, "STRIP"); //STRIP001 /*?*/ RecalcPos( pObj, pData ); +/*N*/ } +/*N*/ } +/*N*/ } + + +/*N*/ void ScDrawLayer::Load( SvStream& rStream ) +/*N*/ { +/*N*/ bRecording = FALSE; +/*N*/ DELETEZ(pUndoGroup); +/*N*/ +/*N*/ ScReadHeader aHdr( rStream ); +/*N*/ while (aHdr.BytesLeft()) +/*N*/ { +/*N*/ USHORT nID; +/*N*/ rStream >> nID; +/*N*/ switch (nID) +/*N*/ { +/*N*/ case SCID_DRAWPOOL: +/*N*/ { +/*N*/ ScReadHeader aPoolHdr( rStream ); +/*N*/ GetItemPool().Load( rStream ); //! in Pool-Stream ? +/*N*/ } +/*N*/ break; +/*N*/ case SCID_DRAWMODEL: +/*N*/ { +/*N*/ ScReadHeader aDrawHdr( rStream ); +/*N*/ rStream >> *this; +/*N*/ +/*N*/ // Control-Layer ist nicht in alten Dateien +/*N*/ SdrLayerAdmin& rAdmin = GetLayerAdmin(); +/*N*/ const SdrLayer* pLayer = rAdmin.GetLayerPerID(SC_LAYER_CONTROLS); +/*N*/ if (!pLayer) +/*N*/ rAdmin.NewLayer( +/*N*/ String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Controls")), +/*N*/ SC_LAYER_CONTROLS); +/*N*/ } +/*N*/ break; +/*N*/ default: +/*N*/ { +/*N*/ DBG_ERROR("unbekannter Sub-Record in ScDrawLayer::Load"); +/*N*/ ScReadHeader aDummyHdr( rStream ); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ GetItemPool().LoadCompleted(); +/*N*/ } + +/*N*/ void ScDrawLayer::Store( SvStream& rStream ) const +/*N*/ { +/*N*/ ScWriteHeader aHdr( rStream ); +/*N*/ +/*N*/ //-/ const_cast<ScDrawLayer*>(this)->PrepareStore(); // non-const +/*N*/ const_cast<ScDrawLayer*>(this)->PreSave(); // non-const +/*N*/ +/*N*/ { +/*N*/ rStream << (USHORT) SCID_DRAWPOOL; +/*N*/ ScWriteHeader aPoolHdr( rStream ); +/*N*/ GetItemPool().Store( rStream ); //! in Pool-Stream ? +/*N*/ } +/*N*/ +/*N*/ { +/*N*/ rStream << (USHORT) SCID_DRAWMODEL; +/*N*/ ScWriteHeader aDrawHdr( rStream ); +/*N*/ rStream << *this; +/*N*/ } +/*N*/ +/*N*/ const_cast<ScDrawLayer*>(this)->PostSave(); // non-const +/*N*/ } + +/*N*/ BOOL ScDrawLayer::GetPrintArea( ScRange& rRange, BOOL bSetHor, BOOL bSetVer ) const +/*N*/ { +/*N*/ DBG_ASSERT( pDoc, "ScDrawLayer::GetPrintArea without document" ); +/*N*/ if ( !pDoc ) +/*N*/ return FALSE; +/*N*/ +/*N*/ USHORT nTab = rRange.aStart.Tab(); +/*N*/ DBG_ASSERT( rRange.aEnd.Tab() == nTab, "GetPrintArea: Tab unterschiedlich" ); +/*N*/ +/*N*/ BOOL bAny = FALSE; +/*N*/ long nEndX = 0; +/*N*/ long nEndY = 0; +/*N*/ long nStartX = LONG_MAX; +/*N*/ long nStartY = LONG_MAX; +/*N*/ USHORT i; +/*N*/ +/*N*/ // Grenzen ausrechnen +/*N*/ +/*N*/ if (!bSetHor) +/*N*/ { +/*?*/ nStartX = 0; +/*?*/ USHORT nStartCol = rRange.aStart.Col(); +/*?*/ for (i=0; i<nStartCol; i++) +/*?*/ nStartX +=pDoc->GetColWidth(i,nTab); +/*?*/ nEndX = nStartX; +/*?*/ USHORT nEndCol = rRange.aEnd.Col(); +/*?*/ for (i=nStartCol; i<=nEndCol; i++) +/*?*/ nEndX += pDoc->GetColWidth(i,nTab); +/*?*/ nStartX = (long)(nStartX * HMM_PER_TWIPS); +/*?*/ nEndX = (long)(nEndX * HMM_PER_TWIPS); +/*N*/ } +/*N*/ if (!bSetVer) +/*N*/ { +/*?*/ nStartY = 0; +/*?*/ USHORT nStartRow = rRange.aStart.Row(); +/*?*/ for (i=0; i<nStartRow; i++) +/*?*/ nStartY +=pDoc->FastGetRowHeight(i,nTab); +/*?*/ nEndY = nStartY; +/*?*/ USHORT nEndRow = rRange.aEnd.Row(); +/*?*/ for (i=nStartRow; i<=nEndRow; i++) +/*?*/ nEndY += pDoc->FastGetRowHeight(i,nTab); +/*?*/ nStartY = (long)(nStartY * HMM_PER_TWIPS); +/*?*/ nEndY = (long)(nEndY * HMM_PER_TWIPS); +/*N*/ } +/*N*/ +/*N*/ const SdrPage* pPage = GetPage(nTab); +/*N*/ DBG_ASSERT(pPage,"Page nicht gefunden"); +/*N*/ if (pPage) +/*N*/ { +/*N*/ SdrObjListIter aIter( *pPage, IM_FLAT ); +/*N*/ SdrObject* pObject = aIter.Next(); +/*N*/ while (pObject) +/*N*/ { +/*N*/ //! Flags (ausgeblendet?) testen +/*N*/ +/*N*/ Rectangle aObjRect = pObject->GetBoundRect(); +/*N*/ BOOL bFit = TRUE; +/*N*/ if ( !bSetHor && ( aObjRect.Right() < nStartX || aObjRect.Left() > nEndX ) ) +/*N*/ bFit = FALSE; +/*N*/ if ( !bSetVer && ( aObjRect.Bottom() < nStartY || aObjRect.Top() > nEndY ) ) +/*N*/ bFit = FALSE; +/*N*/ if ( bFit ) +/*N*/ { +/*N*/ if (bSetHor) +/*N*/ { +/*N*/ if (aObjRect.Left() < nStartX) nStartX = aObjRect.Left(); +/*N*/ if (aObjRect.Right() > nEndX) nEndX = aObjRect.Right(); +/*N*/ } +/*N*/ if (bSetVer) +/*N*/ { +/*N*/ if (aObjRect.Top() < nStartY) nStartY = aObjRect.Top(); +/*N*/ if (aObjRect.Bottom() > nEndY) nEndY = aObjRect.Bottom(); +/*N*/ } +/*N*/ bAny = TRUE; +/*N*/ } +/*N*/ +/*N*/ pObject = aIter.Next(); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if (bAny) +/*N*/ { +/*N*/ DBG_ASSERT( nStartX<=nEndX && nStartY<=nEndY, "Start/End falsch in ScDrawLayer::GetPrintArea" ); +/*N*/ +/*N*/ if (bSetHor) +/*N*/ { +/*N*/ nStartX = (long) (nStartX / HMM_PER_TWIPS); +/*N*/ nEndX = (long) (nEndX / HMM_PER_TWIPS); +/*N*/ long nWidth; +/*N*/ +/*N*/ nWidth = 0; +/*N*/ for (i=0; i<MAXCOL && nWidth<=nStartX; i++) +/*N*/ nWidth += pDoc->GetColWidth(i,nTab); +/*N*/ rRange.aStart.SetCol( i ? (i-1) : 0 ); +/*N*/ +/*N*/ nWidth = 0; +/*N*/ for (i=0; i<MAXCOL && nWidth<=nEndX; i++) //! bei Start anfangen +/*N*/ nWidth += pDoc->GetColWidth(i,nTab); +/*N*/ rRange.aEnd.SetCol( i ? (i-1) : 0 ); +/*N*/ } +/*N*/ +/*N*/ if (bSetVer) +/*N*/ { +/*N*/ nStartY = (long) (nStartY / HMM_PER_TWIPS); +/*N*/ nEndY = (long) (nEndY / HMM_PER_TWIPS); +/*N*/ long nHeight; +/*N*/ +/*N*/ nHeight = 0; +/*N*/ for (i=0; i<MAXROW && nHeight<=nStartY; i++) +/*N*/ nHeight += pDoc->FastGetRowHeight(i,nTab); +/*N*/ rRange.aStart.SetRow( i ? (i-1) : 0 ); +/*N*/ +/*N*/ nHeight = 0; +/*N*/ for (i=0; i<MAXROW && nHeight<=nEndY; i++) +/*N*/ nHeight += pDoc->FastGetRowHeight(i,nTab); +/*N*/ rRange.aEnd.SetRow( i ? (i-1) : 0 ); +/*N*/ } +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ if (bSetHor) +/*N*/ { +/*N*/ rRange.aStart.SetCol(0); +/*N*/ rRange.aEnd.SetCol(0); +/*N*/ } +/*N*/ if (bSetVer) +/*N*/ { +/*N*/ rRange.aStart.SetRow(0); +/*N*/ rRange.aEnd.SetRow(0); +/*N*/ } +/*N*/ } +/*N*/ return bAny; +/*N*/ } + +/*N*/ void ScDrawLayer::AddCalcUndo( SdrUndoAction* pUndo ) +/*N*/ { +/*N*/ if (bRecording) +/*N*/ { +/*N*/ if (!pUndoGroup) +/*N*/ pUndoGroup = new SdrUndoGroup(*this); +/*N*/ +/*N*/ pUndoGroup->AddAction( pUndo ); +/*N*/ } +/*N*/ else +/*N*/ delete pUndo; +/*N*/ } + +// MoveAreaTwips: all measures are kept in twips +/*N*/ void ScDrawLayer::MoveAreaTwips( USHORT nTab, const Rectangle& rArea, +/*N*/ const Point& rMove, const Point& rTopLeft ) +/*N*/ { +/*N*/ if (!rMove.X() && !rMove.Y()) +/*N*/ return; // nix +/*N*/ +/*N*/ SdrPage* pPage = GetPage(nTab); +/*N*/ DBG_ASSERT(pPage,"Page nicht gefunden"); +/*N*/ if (!pPage) +/*N*/ return; +/*N*/ +/*N*/ // fuer Shrinking! +/*N*/ Rectangle aNew( rArea ); +/*N*/ BOOL bShrink = FALSE; +/*N*/ if ( rMove.X() < 0 || rMove.Y() < 0 ) // verkleinern +/*N*/ { +/*N*/ if ( rTopLeft != rArea.TopLeft() ) // sind gleich beim Verschieben von Zellen +/*N*/ { +/*N*/ bShrink = TRUE; +/*N*/ aNew.Left() = rTopLeft.X(); +/*N*/ aNew.Top() = rTopLeft.Y(); +/*N*/ } +/*N*/ } +/*N*/ SdrObjListIter aIter( *pPage, IM_FLAT ); +/*N*/ SdrObject* pObject = aIter.Next(); +/*N*/ while (pObject) +/*N*/ { +/*N*/ if( GetAnchor( pObject ) == SCA_CELL ) +/*N*/ { +/*N*/ if ( GetObjData( pObject ) ) // Detektiv-Pfeil ? +/*N*/ { +/*N*/ // hier nichts +/*N*/ } +/*N*/ else if ( pObject->ISA( SdrEdgeObj ) ) // Verbinder? +/*N*/ { +/*N*/ // hier auch nichts +/*N*/ //! nicht verbundene Enden wie bei Linien (s.u.) behandeln? +/*N*/ } +/*N*/ else if ( pObject->IsPolyObj() && pObject->GetPointCount()==2 ) +/*N*/ { +/*N*/ for (USHORT i=0; i<2; i++) +/*N*/ { +/*N*/ BOOL bMoved = FALSE; +/*N*/ Point aPoint = pObject->GetPoint(i); +/*N*/ lcl_ReverseTwipsToMM( aPoint ); +/*N*/ if (rArea.IsInside(aPoint)) +/*N*/ { +/*N*/ aPoint += rMove; bMoved = TRUE; +/*N*/ } +/*N*/ else if (bShrink && aNew.IsInside(aPoint)) +/*N*/ { +/*?*/ // Punkt ist in betroffener Zelle - Test auf geloeschten Bereich +/*?*/ if ( rMove.X() && aPoint.X() >= rArea.Left() + rMove.X() ) +/*?*/ { +/*?*/ aPoint.X() = rArea.Left() + rMove.X() - SHRINK_DIST_TWIPS; +/*?*/ if ( aPoint.X() < 0 ) aPoint.X() = 0; +/*?*/ bMoved = TRUE; +/*?*/ } +/*?*/ if ( rMove.Y() && aPoint.Y() >= rArea.Top() + rMove.Y() ) +/*?*/ { +/*?*/ aPoint.Y() = rArea.Top() + rMove.Y() - SHRINK_DIST_TWIPS; +/*?*/ if ( aPoint.Y() < 0 ) aPoint.Y() = 0; +/*?*/ bMoved = TRUE; +/*?*/ } +/*N*/ } +/*N*/ if( bMoved ) +/*N*/ { +/*N*/ AddCalcUndo( new SdrUndoGeoObj( *pObject ) ); +/*N*/ lcl_TwipsToMM( aPoint ); +/*N*/ pObject->SetPoint( aPoint, i ); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ Rectangle aObjRect = pObject->GetLogicRect(); +/*N*/ Point aOldMMPos = aObjRect.TopLeft(); // not converted, millimeters +/*N*/ lcl_ReverseTwipsToMM( aObjRect ); +/*N*/ Point aTopLeft = aObjRect.TopLeft(); +/*N*/ Size aMoveSize; +/*N*/ BOOL bDoMove = FALSE; +/*N*/ if (rArea.IsInside(aTopLeft)) +/*N*/ { +/*N*/ aMoveSize = Size(rMove.X(),rMove.Y()); +/*N*/ bDoMove = TRUE; +/*N*/ } +/*N*/ else if (bShrink && aNew.IsInside(aTopLeft)) +/*N*/ { +/*?*/ // Position ist in betroffener Zelle - Test auf geloeschten Bereich +/*?*/ if ( rMove.X() && aTopLeft.X() >= rArea.Left() + rMove.X() ) +/*?*/ { +/*?*/ aMoveSize.Width() = rArea.Left() + rMove.X() - SHRINK_DIST - aTopLeft.X(); +/*?*/ bDoMove = TRUE; +/*?*/ } +/*?*/ if ( rMove.Y() && aTopLeft.Y() >= rArea.Top() + rMove.Y() ) +/*?*/ { +/*?*/ aMoveSize.Height() = rArea.Top() + rMove.Y() - SHRINK_DIST - aTopLeft.Y(); +/*?*/ bDoMove = TRUE; +/*?*/ } +/*N*/ } +/*N*/ if ( bDoMove ) +/*N*/ { +/*N*/ if ( aTopLeft.X() + aMoveSize.Width() < 0 ) +/*?*/ aMoveSize.Width() = -aTopLeft.X(); +/*N*/ if ( aTopLeft.Y() + aMoveSize.Height() < 0 ) +/*?*/ aMoveSize.Height() = -aTopLeft.Y(); +/*N*/ +/*N*/ // get corresponding move size in millimeters: +/*N*/ Point aNewPos( aTopLeft.X() + aMoveSize.Width(), aTopLeft.Y() + aMoveSize.Height() ); +/*N*/ lcl_TwipsToMM( aNewPos ); +/*N*/ aMoveSize = Size( aNewPos.X() - aOldMMPos.X(), aNewPos.Y() - aOldMMPos.Y() ); // millimeters +/*N*/ +/*N*/ AddCalcUndo( new SdrUndoMoveObj( *pObject, aMoveSize ) ); +/*N*/ pObject->Move( aMoveSize ); +/*N*/ } +/*N*/ else if ( rArea.IsInside(aObjRect.BottomRight()) && +/*N*/ !pObject->IsResizeProtect() ) +/*N*/ { +/*N*/ // geschuetzte Groessen werden nicht veraendert +/*N*/ // (Positionen schon, weil sie ja an der Zelle "verankert" sind) +/*N*/ AddCalcUndo( new SdrUndoGeoObj( *pObject ) ); +/*N*/ long nOldSizeX = aObjRect.Right() - aObjRect.Left() + 1; +/*N*/ long nOldSizeY = aObjRect.Bottom() - aObjRect.Top() + 1; +/*N*/ pObject->Resize( aOldMMPos, Fraction( nOldSizeX+rMove.X(), nOldSizeX ), +/*N*/ Fraction( nOldSizeY+rMove.Y(), nOldSizeY ) ); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ pObject = aIter.Next(); +/*N*/ } +/*N*/ } + + +/*N*/ void ScDrawLayer::WidthChanged( USHORT nTab, USHORT nCol, long nDifTwips ) +/*N*/ { +/*N*/ DBG_ASSERT( pDoc, "ScDrawLayer::WidthChanged without document" ); +/*N*/ if ( !pDoc ) +/*N*/ return; +/*N*/ +/*N*/ if (!bAdjustEnabled) +/*N*/ return; +/*N*/ +/*N*/ USHORT i; +/*N*/ Rectangle aRect; +/*N*/ Point aTopLeft; +/*N*/ +/*N*/ for (i=0; i<nCol; i++) +/*N*/ aRect.Left() += pDoc->GetColWidth(i,nTab); +/*N*/ aTopLeft.X() = aRect.Left(); +/*N*/ aRect.Left() += pDoc->GetColWidth(nCol,nTab); +/*N*/ +/*N*/ aRect.Right() = MAXMM; +/*N*/ aRect.Top() = 0; +/*N*/ aRect.Bottom() = MAXMM; +/*N*/ +/*N*/ //! aTopLeft ist falsch, wenn mehrere Spalten auf einmal ausgeblendet werden +/*N*/ +/*N*/ MoveAreaTwips( nTab, aRect, Point( nDifTwips,0 ), aTopLeft ); +/*N*/ } + +/*N*/ void ScDrawLayer::HeightChanged( USHORT nTab, USHORT nRow, long nDifTwips ) +/*N*/ { +/*N*/ DBG_ASSERT( pDoc, "ScDrawLayer::HeightChanged without document" ); +/*N*/ if ( !pDoc ) +/*N*/ return; +/*N*/ +/*N*/ if (!bAdjustEnabled) +/*N*/ return; +/*N*/ +/*N*/ USHORT i; +/*N*/ Rectangle aRect; +/*N*/ Point aTopLeft; +/*N*/ +/*N*/ for (i=0; i<nRow; i++) +/*N*/ aRect.Top() += pDoc->FastGetRowHeight(i,nTab); +/*N*/ aTopLeft.Y() = aRect.Top(); +/*N*/ aRect.Top() += pDoc->FastGetRowHeight(nRow,nTab); +/*N*/ +/*N*/ aRect.Bottom() = MAXMM; +/*N*/ aRect.Left() = 0; +/*N*/ aRect.Right() = MAXMM; +/*N*/ +/*N*/ //! aTopLeft ist falsch, wenn mehrere Zeilen auf einmal ausgeblendet werden +/*N*/ +/*N*/ MoveAreaTwips( nTab, aRect, Point( 0,nDifTwips ), aTopLeft ); +/*N*/ } + +/*N*/ BOOL ScDrawLayer::HasObjectsInRows( USHORT nTab, USHORT nStartRow, USHORT nEndRow ) +/*N*/ { +/*N*/ DBG_ASSERT( pDoc, "ScDrawLayer::HasObjectsInRows without document" ); +/*N*/ if ( !pDoc ) +/*N*/ return FALSE; +/*N*/ +/*N*/ Rectangle aTestRect; +/*N*/ +/*N*/ USHORT i; +/*N*/ for (i=0; i<nStartRow; i++) +/*N*/ aTestRect.Top() += pDoc->FastGetRowHeight(i,nTab); +/*N*/ +/*N*/ if (nEndRow==MAXROW) +/*N*/ aTestRect.Bottom() = MAXMM; +/*N*/ else +/*N*/ { +/*N*/ aTestRect.Bottom() = aTestRect.Top(); +/*N*/ for (i=nStartRow; i<=nEndRow; i++) +/*N*/ { +/*N*/ aTestRect.Bottom() += pDoc->FastGetRowHeight(i,nTab); +/*N*/ } +/*N*/ TwipsToMM( aTestRect.Bottom() ); +/*N*/ } +/*N*/ +/*N*/ TwipsToMM( aTestRect.Top() ); +/*N*/ +/*N*/ aTestRect.Left() = 0; +/*N*/ aTestRect.Right() = MAXMM; +/*N*/ +/*N*/ SdrPage* pPage = GetPage(nTab); +/*N*/ DBG_ASSERT(pPage,"Page nicht gefunden"); +/*N*/ if (!pPage) +/*N*/ return FALSE; +/*N*/ +/*N*/ BOOL bFound = FALSE; +/*N*/ +/*N*/ Rectangle aObjRect; +/*N*/ SdrObjListIter aIter( *pPage ); +/*N*/ SdrObject* pObject = aIter.Next(); +/*N*/ while ( pObject && !bFound ) +/*N*/ { +/*N*/ aObjRect = pObject->GetSnapRect(); //! GetLogicRect ? +/*N*/ if (aTestRect.IsInside(aObjRect.TopLeft()) || aTestRect.IsInside(aObjRect.BottomLeft())) +/*N*/ bFound = TRUE; +/*N*/ +/*N*/ pObject = aIter.Next(); +/*N*/ } +/*N*/ +/*N*/ return bFound; +/*N*/ } + + + + + + + + +// static + +/*N*/ inline BOOL IsNamedObject( SdrObject* pObj, const String& rName ) +/*N*/ { +/*N*/ // TRUE if rName is the object's Name or PersistName +/*N*/ // (used to find a named object) +/*N*/ +/*N*/ return ( pObj->GetName() == rName || +/*N*/ ( pObj->GetObjIdentifier() == OBJ_OLE2 && +/*N*/ static_cast<SdrOle2Obj*>(pObj)->GetPersistName() == rName ) ); +/*N*/ } + +/*N*/ SdrObject* ScDrawLayer::GetNamedObject( const String& rName, USHORT nId, USHORT& rFoundTab ) const +/*N*/ { +/*N*/ USHORT nTabCount = GetPageCount(); +/*N*/ for (USHORT nTab=0; nTab<nTabCount; nTab++) +/*N*/ { +/*N*/ const SdrPage* pPage = GetPage(nTab); +/*N*/ DBG_ASSERT(pPage,"Page ?"); +/*N*/ if (pPage) +/*N*/ { +/*N*/ SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS ); +/*N*/ SdrObject* pObject = aIter.Next(); +/*N*/ while (pObject) +/*N*/ { +/*N*/ if ( nId == 0 || pObject->GetObjIdentifier() == nId ) +/*N*/ if ( IsNamedObject( pObject, rName ) ) +/*N*/ { +/*N*/ rFoundTab = nTab; +/*N*/ return pObject; +/*N*/ } +/*N*/ +/*N*/ pObject = aIter.Next(); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ return NULL; +/*N*/ } + + + + +/*N*/ void ScDrawLayer::SetAnchor( SdrObject* pObj, ScAnchorType eType ) +/*N*/ { +/*N*/ // Ein an der Seite verankertes Objekt zeichnet sich durch eine Anker-Pos +/*N*/ // von (0,1) aus. Das ist ein shabby Trick, der aber funktioniert! +/*N*/ Point aAnchor( 0, eType == SCA_PAGE ? 1 : 0 ); +/*N*/ pObj->SetAnchorPos( aAnchor ); +/*N*/ } + +/*N*/ ScAnchorType ScDrawLayer::GetAnchor( const SdrObject* pObj ) +/*N*/ { +/*N*/ Point aAnchor( pObj->GetAnchorPos() ); +/*N*/ return ( aAnchor.Y() != 0 ) ? SCA_PAGE : SCA_CELL; +/*N*/ } + +/*N*/ ScDrawObjData* ScDrawLayer::GetObjData( SdrObject* pObj, BOOL bCreate ) // static +/*N*/ { +/*N*/ USHORT nCount = pObj->GetUserDataCount(); +/*N*/ for( USHORT i = 0; i < nCount; i++ ) +/*N*/ { +/*?*/ SdrObjUserData* pData = pObj->GetUserData( i ); +/*?*/ if( pData && pData->GetInventor() == SC_DRAWLAYER +/*?*/ && pData->GetId() == SC_UD_OBJDATA ) +/*?*/ return (ScDrawObjData*) pData; +/*N*/ } +/*N*/ if( bCreate ) +/*N*/ { +/*N*/ ScDrawObjData* pData = new ScDrawObjData; +/*N*/ pObj->InsertUserData( pData, 0 ); +/*N*/ return pData; +/*N*/ } +/*N*/ return NULL; +/*N*/ } + +/*N*/ ScIMapInfo* ScDrawLayer::GetIMapInfo( SdrObject* pObj ) // static +/*N*/ { +/*N*/ USHORT nCount = pObj->GetUserDataCount(); +/*N*/ for( USHORT i = 0; i < nCount; i++ ) +/*N*/ { +/*?*/ SdrObjUserData* pData = pObj->GetUserData( i ); +/*?*/ if( pData && pData->GetInventor() == SC_DRAWLAYER +/*?*/ && pData->GetId() == SC_UD_IMAPDATA ) +/*?*/ return (ScIMapInfo*) pData; +/*N*/ } +/*N*/ return NULL; +/*N*/ } + + +// static: + + +/*N*/ void __EXPORT ScDrawLayer::SetChanged( FASTBOOL bFlg /* =TRUE */ ) +/*N*/ { +/*N*/ if ( bFlg && pDoc ) +/*N*/ pDoc->SetChartListenerCollectionNeedsUpdate( TRUE ); +/*N*/ FmFormModel::SetChanged( bFlg ); +/*N*/ } + +/*N*/ SvStream* __EXPORT ScDrawLayer::GetDocumentStream(SdrDocumentStreamInfo& rStreamInfo) const +/*N*/ { +/*N*/ DBG_ASSERT( pDoc, "ScDrawLayer::GetDocumentStream without document" ); +/*N*/ if ( !pDoc ) +/*N*/ return NULL; +/*N*/ +/*N*/ SvStorage* pStor = pDoc->GetDocumentShell() ? pDoc->GetDocumentShell()->GetMedium()->GetStorage() : NULL; +/*N*/ SvStream* pRet = NULL; +/*N*/ +/*N*/ if( pStor ) +/*N*/ { +/*N*/ if( rStreamInfo.maUserData.Len() && +/*N*/ ( rStreamInfo.maUserData.GetToken( 0, ':' ) == +/*N*/ String( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package" ) ) ) ) +/*N*/ { +/*?*/ const String aPicturePath( rStreamInfo.maUserData.GetToken( 1, ':' ) ); +/*?*/ +/*?*/ // graphic from picture stream in picture storage in XML package +/*?*/ if( aPicturePath.GetTokenCount( '/' ) == 2 ) +/*?*/ { +/*?*/ const String aPictureStreamName( aPicturePath.GetToken( 1, '/' ) ); +/*?*/ +/*?*/ if( !xPictureStorage.Is() ) +/*?*/ { +/*?*/ const String aPictureStorageName( aPicturePath.GetToken( 0, '/' ) ); +/*?*/ +/*?*/ if( pStor->IsContained( aPictureStorageName ) && +/*?*/ pStor->IsStorage( aPictureStorageName ) ) +/*?*/ { +/*?*/ ( (ScDrawLayer*) this )->xPictureStorage = pStor->OpenUCBStorage( aPictureStorageName, STREAM_READ | STREAM_WRITE ); +/*?*/ } +/*?*/ } +/*?*/ +/*?*/ if( xPictureStorage.Is() && +/*?*/ xPictureStorage->IsContained( aPictureStreamName ) && +/*?*/ xPictureStorage->IsStream( aPictureStreamName ) ) +/*?*/ { +/*?*/ pRet = xPictureStorage->OpenStream( aPictureStreamName ); +/*?*/ } +/*?*/ } +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ pRet = pStor->OpenStream( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(STRING_SCSTREAM)), +/*N*/ STREAM_READ | STREAM_WRITE | STREAM_TRUNC ); +/*N*/ +/*N*/ if( pRet ) +/*N*/ { +/*N*/ pRet->SetVersion( pStor->GetVersion() ); +/*N*/ pRet->SetKey( pStor->GetKey() ); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ rStreamInfo.mbDeleteAfterUse = ( pRet != NULL ); +/*N*/ } +/*N*/ +/*N*/ return pRet; +/*N*/ } + +/*N*/ void ScDrawLayer::ReleasePictureStorage() +/*N*/ { +/*N*/ xPictureStorage.Clear(); +/*N*/ } + + + + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |