Files
libreoffice/sc/source/ui/view/drawview.cxx

884 lines
28 KiB
C++
Raw Normal View History

2000-09-18 16:07:07 +00:00
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2000-09-18 16:07:07 +00:00
*
* Copyright 2008 by Sun Microsystems, Inc.
2000-09-18 16:07:07 +00:00
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 16:07:07 +00:00
*
* $RCSfile: drawview.cxx,v $
* $Revision: 1.50.142.2 $
2000-09-18 16:07:07 +00:00
*
* This file is part of OpenOffice.org.
2000-09-18 16:07:07 +00:00
*
* 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.
2000-09-18 16:07:07 +00:00
*
* 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).
2000-09-18 16:07:07 +00:00
*
* 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.
2000-09-18 16:07:07 +00:00
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
2000-09-18 16:07:07 +00:00
// INCLUDE ---------------------------------------------------------------
#include <com/sun/star/embed/EmbedStates.hpp>
2000-09-18 16:07:07 +00:00
#include <svx/svditer.hxx>
#include <svx/svdograf.hxx>
#include <svx/svdomedia.hxx>
2000-09-18 16:07:07 +00:00
#include <svx/svdogrp.hxx>
#include <svx/svdoole2.hxx>
#include <svx/svdouno.hxx>
#include <svx/svdpage.hxx>
#include <svx/svdundo.hxx>
#include <svx/svdocapt.hxx>
#include <svx/outlobj.hxx>
#include <svx/writingmodeitem.hxx>
#include <svx/sdrpaintwindow.hxx>
2000-09-18 16:07:07 +00:00
#include <sfx2/bindings.hxx>
#include <sfx2/viewfrm.hxx>
2000-09-18 16:07:07 +00:00
#include "drawview.hxx"
#include "global.hxx"
#include "viewdata.hxx"
#include "document.hxx"
#include "drawutil.hxx"
#include "futext.hxx"
2000-09-18 16:07:07 +00:00
#include "globstr.hrc"
#include "tabvwsh.hxx"
#include "client.hxx"
#include "scmod.hxx"
#include "drwlayer.hxx"
#include "docsh.hxx"
#include "viewuno.hxx"
#include "userdat.hxx"
#include "postit.hxx"
2000-09-18 16:07:07 +00:00
#include "sc.hrc"
using namespace com::sun::star;
2000-09-18 16:07:07 +00:00
// -----------------------------------------------------------------------
#define SC_HANDLESIZE_BIG 9
#define SC_HANDLESIZE_SMALL 7
// -----------------------------------------------------------------------
#ifdef _MSC_VER
2000-09-18 16:07:07 +00:00
#pragma optimize ( "", off )
#endif
void ScDrawView::Construct()
{
EnableExtendedKeyInputDispatcher(FALSE);
EnableExtendedMouseEventDispatcher(FALSE);
EnableExtendedCommandEventDispatcher(FALSE);
SetFrameDragSingles(TRUE);
// SetSolidMarkHdl(TRUE); // einstellbar -> UpdateUserViewOptions
SetMinMoveDistancePixel( 2 );
SetHitTolerancePixel( 2 );
if (pViewData)
{
SCTAB nViewTab = pViewData->GetTabNo();
ShowSdrPage(GetModel()->GetPage(nViewTab));
2000-09-18 16:07:07 +00:00
BOOL bEx = pViewData->GetViewShell()->IsDrawSelMode();
BOOL bProt = pDoc->IsTabProtected( nViewTab ) ||
2000-09-18 16:07:07 +00:00
pViewData->GetSfxDocShell()->IsReadOnly();
SdrLayer* pLayer;
SdrLayerAdmin& rAdmin = GetModel()->GetLayerAdmin();
pLayer = rAdmin.GetLayerPerID(SC_LAYER_BACK);
if (pLayer)
SetLayerLocked( pLayer->GetName(), bProt || !bEx );
pLayer = rAdmin.GetLayerPerID(SC_LAYER_INTERN);
if (pLayer)
SetLayerLocked( pLayer->GetName(), TRUE );
pLayer = rAdmin.GetLayerPerID(SC_LAYER_FRONT);
if (pLayer)
{
SetLayerLocked( pLayer->GetName(), bProt );
SetActiveLayer( pLayer->GetName() ); // FRONT als aktiven Layer setzen
}
pLayer = rAdmin.GetLayerPerID(SC_LAYER_CONTROLS);
if (pLayer)
SetLayerLocked( pLayer->GetName(), bProt );
pLayer = rAdmin.GetLayerPerID(SC_LAYER_HIDDEN);
if (pLayer)
{
SetLayerLocked( pLayer->GetName(), bProt );
SetLayerVisible( pLayer->GetName(), sal_False);
}
2000-09-18 16:07:07 +00:00
SetSwapAsynchron(TRUE);
}
else
{
ShowSdrPage(GetModel()->GetPage(nTab));
}
2000-09-18 16:07:07 +00:00
UpdateUserViewOptions();
RecalcScale();
UpdateWorkArea();
bInConstruct = FALSE;
}
void ScDrawView::ImplClearCalcDropMarker()
{
if(pDropMarker)
{
delete pDropMarker;
pDropMarker = 0L;
}
}
2000-09-18 16:07:07 +00:00
__EXPORT ScDrawView::~ScDrawView()
{
ImplClearCalcDropMarker();
2000-09-18 16:07:07 +00:00
}
void ScDrawView::AddCustomHdl()
{
BOOL bNegativePage = pDoc->IsNegativePage( nTab );
const SdrMarkList &rMrkList = GetMarkedObjectList();
2000-09-18 16:07:07 +00:00
UINT32 nCount = rMrkList.GetMarkCount();
for(UINT32 nPos=0; nPos<nCount; nPos++ )
{
const SdrObject* pObj = rMrkList.GetMark(nPos)->GetMarkedSdrObj();
2000-09-18 16:07:07 +00:00
if(ScDrawLayer::GetAnchor(pObj) == SCA_CELL)
{
const INT32 nDelta = 1;
Rectangle aBoundRect = pObj->GetCurrentBoundRect();
Point aPos;
if (bNegativePage)
{
aPos = aBoundRect.TopRight();
aPos.X() = -aPos.X(); // so the loop below is the same
}
else
aPos = aBoundRect.TopLeft();
2000-09-18 16:07:07 +00:00
long nPosX = (long) (aPos.X() / HMM_PER_TWIPS) + nDelta;
long nPosY = (long) (aPos.Y() / HMM_PER_TWIPS) + nDelta;
SCCOL nCol;
2000-09-18 16:07:07 +00:00
INT32 nWidth = 0;
for(nCol=0; nCol<=MAXCOL && nWidth<=nPosX; nCol++)
nWidth += pDoc->GetColWidth(nCol,nTab);
if(nCol > 0)
2000-09-18 16:07:07 +00:00
--nCol;
SCROW nRow = nPosY <= 0 ? 0 : pDoc->FastGetRowForHeight( nTab,
(ULONG) nPosY);
if(nRow > 0)
2000-09-18 16:07:07 +00:00
--nRow;
ScTabView* pView = pViewData->GetView();
ScAddress aScAddress(nCol, nRow, nTab);
pView->CreateAnchorHandles(aHdl, aScAddress);
}
}
}
void ScDrawView::InvalidateAttribs()
{
2000-09-22 17:57:10 +00:00
if (!pViewData) return;
SfxBindings& rBindings = pViewData->GetBindings();
2000-09-18 16:07:07 +00:00
// echte Statuswerte:
rBindings.InvalidateAll( TRUE );
2000-09-18 16:07:07 +00:00
}
void ScDrawView::InvalidateDrawTextAttrs()
{
2000-09-22 17:57:10 +00:00
if (!pViewData) return;
SfxBindings& rBindings = pViewData->GetBindings();
2000-09-18 16:07:07 +00:00
// cjk/ctl font items have no configured slots,
// need no invalidate
2000-09-18 16:07:07 +00:00
rBindings.Invalidate( SID_ATTR_CHAR_FONT );
rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
rBindings.Invalidate( SID_ATTR_CHAR_WEIGHT );
rBindings.Invalidate( SID_ATTR_CHAR_POSTURE );
rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE );
rBindings.Invalidate( SID_ULINE_VAL_NONE );
rBindings.Invalidate( SID_ULINE_VAL_SINGLE );
rBindings.Invalidate( SID_ULINE_VAL_DOUBLE );
rBindings.Invalidate( SID_ULINE_VAL_DOTTED );
rBindings.Invalidate( SID_ATTR_CHAR_OVERLINE );
2000-09-18 16:07:07 +00:00
rBindings.Invalidate( SID_ATTR_CHAR_COLOR );
rBindings.Invalidate( SID_ALIGNLEFT );
rBindings.Invalidate( SID_ALIGNCENTERHOR );
rBindings.Invalidate( SID_ALIGNRIGHT );
rBindings.Invalidate( SID_ALIGNBLOCK );
2000-09-18 16:07:07 +00:00
rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_10 );
rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_15 );
rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_20 );
rBindings.Invalidate( SID_SET_SUPER_SCRIPT );
rBindings.Invalidate( SID_SET_SUB_SCRIPT );
rBindings.Invalidate( SID_TEXTDIRECTION_LEFT_TO_RIGHT );
rBindings.Invalidate( SID_TEXTDIRECTION_TOP_TO_BOTTOM );
rBindings.Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT );
rBindings.Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT );
// pseudo slots for Format menu
rBindings.Invalidate( SID_ALIGN_ANY_LEFT );
rBindings.Invalidate( SID_ALIGN_ANY_HCENTER );
rBindings.Invalidate( SID_ALIGN_ANY_RIGHT );
rBindings.Invalidate( SID_ALIGN_ANY_JUSTIFIED );
2000-09-18 16:07:07 +00:00
}
//void ScDrawView::DrawMarks( OutputDevice* pOut ) const
//{
// DBG_ASSERT(pOut, "ScDrawView::DrawMarks: No OutputDevice (!)");
// SdrPaintWindow* pPaintWindow = FindPaintWindow(*pOut);
//
// if(pPaintWindow)
// {
// if(pPaintWindow->isXorVisible())
// {
// ToggleShownXor(pOut, 0L);
// }
// }
//}
2000-09-18 16:07:07 +00:00
void ScDrawView::SetMarkedToLayer( BYTE nLayerNo )
{
if (AreObjectsMarked())
2000-09-18 16:07:07 +00:00
{
// #i11702# use SdrUndoObjectLayerChange for undo
// STR_UNDO_SELATTR is "Attributes" - should use a different text later
BegUndo( ScGlobal::GetRscString( STR_UNDO_SELATTR ) );
const SdrMarkList& rMark = GetMarkedObjectList();
2000-09-18 16:07:07 +00:00
ULONG nCount = rMark.GetMarkCount();
for (ULONG i=0; i<nCount; i++)
{
SdrObject* pObj = rMark.GetMark(i)->GetMarkedSdrObj();
2000-09-18 16:07:07 +00:00
if ( !pObj->ISA(SdrUnoObj) )
{
AddUndo( new SdrUndoObjectLayerChange( *pObj, pObj->GetLayer(), (SdrLayerID)nLayerNo) );
2000-09-18 16:07:07 +00:00
pObj->SetLayer( nLayerNo );
}
2000-09-18 16:07:07 +00:00
}
EndUndo();
// repaint is done in SetLayer
pViewData->GetDocShell()->SetDrawModified();
// #84073# check mark list now instead of later in a timer
CheckMarked();
MarkListHasChanged();
2000-09-18 16:07:07 +00:00
}
}
BOOL ScDrawView::HasMarkedControl() const
{
if (AreObjectsMarked())
2000-09-18 16:07:07 +00:00
{
const SdrMarkList& rMark = GetMarkedObjectList();
2000-09-18 16:07:07 +00:00
ULONG nCount = rMark.GetMarkCount();
for (ULONG i=0; i<nCount; i++)
{
SdrObject* pObj = rMark.GetMark(i)->GetMarkedSdrObj();
2000-09-18 16:07:07 +00:00
if ( pObj->ISA(SdrUnoObj) )
return TRUE;
else if ( pObj->ISA(SdrObjGroup) )
{
SdrObjListIter aIter( *pObj, IM_DEEPWITHGROUPS );
SdrObject* pSubObj = aIter.Next();
while (pSubObj)
{
if ( pSubObj->ISA(SdrUnoObj) )
return TRUE;
pSubObj = aIter.Next();
}
}
}
}
return FALSE; // war nix
}
void ScDrawView::UpdateWorkArea()
{
SdrPage* pPage = GetModel()->GetPage(static_cast<sal_uInt16>(nTab));
2000-09-18 16:07:07 +00:00
if (pPage)
{
Point aPos;
Size aPageSize( pPage->GetSize() );
Rectangle aNewArea( aPos, aPageSize );
if ( aPageSize.Width() < 0 )
{
// RTL: from max.negative (left) to zero (right)
aNewArea.Right() = 0;
aNewArea.Left() = aPageSize.Width() + 1;
}
SetWorkArea( aNewArea );
}
2000-09-18 16:07:07 +00:00
else
{
2000-09-18 16:07:07 +00:00
DBG_ERROR("Page nicht gefunden");
}
2000-09-18 16:07:07 +00:00
}
void ScDrawView::DoCut()
{
DoCopy();
BegUndo( ScGlobal::GetRscString( STR_UNDO_CUT ) );
DeleteMarked(); // auf dieser View - von der 505f Umstellung nicht betroffen
EndUndo();
}
void ScDrawView::GetScale( Fraction& rFractX, Fraction& rFractY ) const
{
rFractX = aScaleX;
rFractY = aScaleY;
}
void ScDrawView::RecalcScale()
{
double nPPTX;
double nPPTY;
Fraction aZoomX(1,1);
Fraction aZoomY(1,1);
if (pViewData)
{
nTab = pViewData->GetTabNo();
nPPTX = pViewData->GetPPTX();
nPPTY = pViewData->GetPPTY();
aZoomX = pViewData->GetZoomX();
aZoomY = pViewData->GetZoomY();
}
else
{
Point aLogic = pDev->LogicToPixel( Point(1000,1000), MAP_TWIP );
nPPTX = aLogic.X() / 1000.0;
nPPTY = aLogic.Y() / 1000.0;
//! Zoom uebergeben ???
}
SCCOL nEndCol = 0;
SCROW nEndRow = 0;
2000-09-18 16:07:07 +00:00
pDoc->GetTableArea( nTab, nEndCol, nEndRow );
if (nEndCol<20)
nEndCol = 20;
if (nEndRow<20)
nEndRow = 20;
ScDrawUtil::CalcScale( pDoc, nTab, 0,0, nEndCol,nEndRow, pDev,aZoomX,aZoomY,nPPTX,nPPTY,
aScaleX,aScaleY );
}
void ScDrawView::DoConnect(SdrOle2Obj* pOleObj)
{
if ( pViewData )
pViewData->GetViewShell()->ConnectObject( pOleObj );
}
2000-09-18 16:07:07 +00:00
void __EXPORT ScDrawView::MarkListHasChanged()
{
FmFormView::MarkListHasChanged();
UpdateBrowser();
ScTabViewShell* pViewSh = pViewData->GetViewShell();
if (!bInConstruct) // nicht wenn die View gerade angelegt wird
{
pViewSh->Unmark(); // Selektion auff'm Doc entfernen
// #65379# end cell edit mode if drawing objects are selected
if ( GetMarkedObjectList().GetMarkCount() )
2000-09-18 16:07:07 +00:00
SC_MOD()->InputEnterHandler();
}
// IP deaktivieren
ScModule* pScMod = SC_MOD();
bool bUnoRefDialog = pScMod->IsRefDialogOpen() && pScMod->GetCurRefDlgId() == WID_SIMPLE_REF;
2000-09-18 16:07:07 +00:00
ScClient* pClient = (ScClient*) pViewSh->GetIPClient();
if ( pClient && pClient->IsObjectInPlaceActive() && !bUnoRefDialog )
2000-09-18 16:07:07 +00:00
{
// #41730# beim ViewShell::Activate aus dem Reset2Open nicht die Handles anzeigen
//HMHbDisableHdl = TRUE;
pClient->DeactivateObject();
//HMHbDisableHdl = FALSE;
2000-09-18 16:07:07 +00:00
// Image-Ole wieder durch Grafik ersetzen passiert jetzt in ScClient::UIActivate
}
// Ole-Objekt selektiert?
SdrOle2Obj* pOle2Obj = NULL;
SdrGrafObj* pGrafObj = NULL;
SdrMediaObj* pMediaObj = NULL;
2000-09-18 16:07:07 +00:00
const SdrMarkList& rMarkList = GetMarkedObjectList();
2000-09-18 16:07:07 +00:00
ULONG nMarkCount = rMarkList.GetMarkCount();
if ( nMarkCount == 0 && !pViewData->GetViewShell()->IsDrawSelMode() && !bInConstruct )
{
// re-lock background layer if it was unlocked in SelectObject
SdrLayer* pLayer = GetModel()->GetLayerAdmin().GetLayerPerID(SC_LAYER_BACK);
if ( pLayer && !IsLayerLocked( pLayer->GetName() ) )
SetLayerLocked( pLayer->GetName(), TRUE );
// re-lock this internal note object.
pLayer = GetModel()->GetLayerAdmin().GetLayerPerID(SC_LAYER_INTERN);
if ( pLayer && !IsLayerLocked( pLayer->GetName() ) )
SetLayerLocked( pLayer->GetName(), TRUE );
2000-09-18 16:07:07 +00:00
}
BOOL bSubShellSet = FALSE;
2000-09-18 16:07:07 +00:00
if (nMarkCount == 1)
{
SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
2000-09-18 16:07:07 +00:00
if (pObj->GetObjIdentifier() == OBJ_OLE2)
{
pOle2Obj = (SdrOle2Obj*) pObj;
if (!pDoc->IsChart(pObj) )
pViewSh->SetOleObjectShell(TRUE);
else
pViewSh->SetChartShell(TRUE);
bSubShellSet = TRUE;
2000-09-18 16:07:07 +00:00
}
else if (pObj->GetObjIdentifier() == OBJ_GRAF)
{
pGrafObj = (SdrGrafObj*) pObj;
pViewSh->SetGraphicShell(TRUE);
bSubShellSet = TRUE;
2000-09-18 16:07:07 +00:00
}
else if (pObj->GetObjIdentifier() == OBJ_MEDIA)
{
pMediaObj = (SdrMediaObj*) pObj;
pViewSh->SetMediaShell(TRUE);
bSubShellSet = TRUE;
}
else if (pObj->GetObjIdentifier() != OBJ_TEXT // Verhindern, das beim Anlegen
2000-09-18 16:07:07 +00:00
|| !pViewSh->IsDrawTextShell()) // eines TextObjekts auf die
{ // DrawShell umgeschaltet wird.
pViewSh->SetDrawShell(TRUE); //@#70206#
}
}
if ( nMarkCount && !bSubShellSet )
2000-09-18 16:07:07 +00:00
{
BOOL bOnlyControls = TRUE;
BOOL bOnlyGraf = TRUE;
2000-09-18 16:07:07 +00:00
for (ULONG i=0; i<nMarkCount; i++)
{
SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
2000-09-18 16:07:07 +00:00
if ( pObj->ISA( SdrObjGroup ) )
{
const SdrObjList *pLst = ((SdrObjGroup*)pObj)->GetSubList();
ULONG nListCount = pLst->GetObjCount();
if ( nListCount == 0 )
{
// #104156# An empty group (may occur during Undo) is no control or graphics object.
// Creating the form shell during undo would lead to problems with the undo manager.
bOnlyControls = FALSE;
bOnlyGraf = FALSE;
}
for ( USHORT j = 0; j < nListCount; ++j )
2000-09-18 16:07:07 +00:00
{
SdrObject *pSubObj = pLst->GetObj( j );
if (!pSubObj->ISA(SdrUnoObj))
2000-09-18 16:07:07 +00:00
bOnlyControls = FALSE;
if (pSubObj->GetObjIdentifier() != OBJ_GRAF)
bOnlyGraf = FALSE;
2000-09-18 16:07:07 +00:00
if ( !bOnlyControls && !bOnlyGraf ) break;
}
2000-09-18 16:07:07 +00:00
}
else
2000-09-18 16:07:07 +00:00
{
if (!pObj->ISA(SdrUnoObj))
bOnlyControls = FALSE;
if (pObj->GetObjIdentifier() != OBJ_GRAF)
bOnlyGraf = FALSE;
2000-09-18 16:07:07 +00:00
}
if ( !bOnlyControls && !bOnlyGraf ) break;
2000-09-18 16:07:07 +00:00
}
if(bOnlyControls)
{
pViewSh->SetDrawFormShell(TRUE); // jetzt UNO-Controls
}
else if(bOnlyGraf)
{
pViewSh->SetGraphicShell(TRUE);
}
2000-09-18 16:07:07 +00:00
else if(nMarkCount>1)
{
pViewSh->SetDrawShell(TRUE);
}
}
// Verben anpassen
SfxViewFrame* pViewFrame = pViewSh->GetViewFrame();
BOOL bOle = pViewSh->GetViewFrame()->GetFrame()->IsInPlace();
2000-09-18 16:07:07 +00:00
if ( pOle2Obj && !bOle )
{
uno::Reference < embed::XEmbeddedObject > xObj = pOle2Obj->GetObjRef();
if (xObj.is())
pViewSh->SetVerbs( xObj->getSupportedVerbs() );
2000-09-18 16:07:07 +00:00
else
{
DBG_ERROR("SdrOle2Obj ohne ObjRef");
pViewSh->SetVerbs( 0 );
}
}
else
pViewSh->SetVerbs( 0 );
// Image-Map Editor
if ( pOle2Obj )
UpdateIMap( pOle2Obj );
else if ( pGrafObj )
UpdateIMap( pGrafObj );
InvalidateAttribs(); // nach dem IMap-Editor Update
InvalidateDrawTextAttrs();
for(sal_uInt32 a(0L); a < PaintWindowCount(); a++)
2000-09-18 16:07:07 +00:00
{
SdrPaintWindow* pPaintWindow = GetPaintWindow(a);
OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
if(OUTDEV_WINDOW == rOutDev.GetOutDevType())
{
((Window&)rOutDev).Update();
}
2000-09-18 16:07:07 +00:00
}
2001-10-02 17:41:42 +00:00
// uno object for view returns drawing objects as selection,
// so it must notify its SelectionChangeListeners
if (pViewFrame)
{
SfxFrame* pFrame = pViewFrame->GetFrame();
if (pFrame)
{
uno::Reference<frame::XController> xController = pFrame->GetController();
if (xController.is())
{
ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController );
if (pImp)
pImp->SelectionChanged();
}
}
}
2001-10-02 17:41:42 +00:00
// update selection transfer object
pViewSh->CheckSelectionTransfer();
2000-09-18 16:07:07 +00:00
}
void __EXPORT ScDrawView::ModelHasChanged()
{
SdrObject* pEditObj = GetTextEditObject();
if ( pEditObj && !pEditObj->IsInserted() && pViewData )
{
// #111700# SdrObjEditView::ModelHasChanged will end text edit in this case,
// so make sure the EditEngine's undo manager is no longer used.
pViewData->GetViewShell()->SetDrawTextUndo(NULL);
SetCreateMode(); // don't leave FuText in a funny state
}
2000-09-18 16:07:07 +00:00
FmFormView::ModelHasChanged();
}
void __EXPORT ScDrawView::UpdateUserViewOptions()
{
if (pViewData)
{
const ScViewOptions& rOpt = pViewData->GetOptions();
const ScGridOptions& rGrid = rOpt.GetGridOptions();
BOOL bBigHdl = rOpt.GetOption( VOPT_BIGHANDLES );
SetDragStripes( rOpt.GetOption( VOPT_HELPLINES ) );
SetSolidMarkHdl( rOpt.GetOption( VOPT_SOLIDHANDLES ) );
SetMarkHdlSizePixel( bBigHdl ? SC_HANDLESIZE_BIG : SC_HANDLESIZE_SMALL );
SetGridVisible( rGrid.GetGridVisible() );
SetSnapEnabled( rGrid.GetUseGridSnap() );
SetGridSnap( rGrid.GetUseGridSnap() );
// Snap from grid options is no longer used
// SetSnapGrid( Size( rGrid.GetFldSnapX(), rGrid.GetFldSnapY() ) );
Fraction aFractX( rGrid.GetFldDrawX(), rGrid.GetFldDivisionX() + 1 );
Fraction aFractY( rGrid.GetFldDrawY(), rGrid.GetFldDivisionY() + 1 );
SetSnapGridWidth( aFractX, aFractY );
2000-09-18 16:07:07 +00:00
SetGridCoarse( Size( rGrid.GetFldDrawX(), rGrid.GetFldDrawY() ) );
SetGridFine( Size( rGrid.GetFldDrawX() / (rGrid.GetFldDivisionX() + 1),
rGrid.GetFldDrawY() / (rGrid.GetFldDivisionY() + 1) ) );
}
}
#ifdef _MSC_VER
2000-09-18 16:07:07 +00:00
#pragma optimize ( "", on )
#endif
BOOL ScDrawView::SelectObject( const String& rName )
{
UnmarkAll();
SCTAB nObjectTab = 0;
2000-09-18 16:07:07 +00:00
SdrObject* pFound = NULL;
SfxObjectShell* pShell = pDoc->GetDocumentShell();
if (pShell)
{
SdrModel* pDrawLayer = GetModel();
SCTAB nTabCount = pDoc->GetTableCount();
for (SCTAB i=0; i<nTabCount && !pFound; i++)
2000-09-18 16:07:07 +00:00
{
SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(i));
2000-09-18 16:07:07 +00:00
DBG_ASSERT(pPage,"Page ?");
if (pPage)
{
SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS );
SdrObject* pObject = aIter.Next();
while (pObject && !pFound)
{
if ( ScDrawLayer::GetVisibleName( pObject ) == rName )
2000-09-18 16:07:07 +00:00
{
pFound = pObject;
nObjectTab = i;
}
pObject = aIter.Next();
}
}
}
}
if ( pFound )
{
ScTabView* pView = pViewData->GetView();
if ( nObjectTab != nTab ) // Tabelle umschalten
pView->SetTabNo( nObjectTab );
DBG_ASSERT( nTab == nObjectTab, "Tabellen umschalten hat nicht geklappt" );
pView->ScrollToObject( pFound );
// #61585# to select an object on the background layer, the layer has to
// be unlocked even if exclusive drawing selection mode is not active
// (this is reversed in MarkListHasChanged when nothing is selected)
if ( pFound->GetLayer() == SC_LAYER_BACK &&
!pViewData->GetViewShell()->IsDrawSelMode() &&
!pDoc->IsTabProtected( nTab ) &&
!pViewData->GetSfxDocShell()->IsReadOnly() )
{
SdrLayer* pLayer = GetModel()->GetLayerAdmin().GetLayerPerID(SC_LAYER_BACK);
if (pLayer)
SetLayerLocked( pLayer->GetName(), FALSE );
}
SdrPageView* pPV = GetSdrPageView();
2000-09-18 16:07:07 +00:00
MarkObj( pFound, pPV );
}
return ( pFound != NULL );
}
//UNUSED2008-05 String ScDrawView::GetSelectedChartName() const
//UNUSED2008-05 {
//UNUSED2008-05 // used for modifying a chart's data area - PersistName must always be used
//UNUSED2008-05 // (as in ScDocument::FindChartData and UpdateChartArea)
//UNUSED2008-05
//UNUSED2008-05 const SdrMarkList& rMarkList = GetMarkedObjectList();
//UNUSED2008-05 if (rMarkList.GetMarkCount() == 1)
//UNUSED2008-05 {
//UNUSED2008-05 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
//UNUSED2008-05 if (pObj->GetObjIdentifier() == OBJ_OLE2)
//UNUSED2008-05 if ( pDoc->IsChart(pObj) )
//UNUSED2008-05 return static_cast<SdrOle2Obj*>(pObj)->GetPersistName();
//UNUSED2008-05 }
//UNUSED2008-05
//UNUSED2008-05 return EMPTY_STRING; // nichts gefunden
//UNUSED2008-05 }
2000-09-18 16:07:07 +00:00
FASTBOOL ScDrawView::InsertObjectSafe(SdrObject* pObj, SdrPageView& rPV, ULONG nOptions)
{
// Markierung nicht aendern, wenn Ole-Objekt aktiv
// (bei Drop aus Ole-Objekt wuerde sonst mitten im ExecuteDrag deaktiviert!)
if (pViewData)
{
SfxInPlaceClient* pClient = pViewData->GetViewShell()->GetIPClient();
if ( pClient && pClient->IsObjectInPlaceActive() )
2000-09-18 16:07:07 +00:00
nOptions |= SDRINSERT_DONTMARK;
}
return InsertObjectAtView( pObj, rPV, nOptions );
2000-09-18 16:07:07 +00:00
}
void __EXPORT ScDrawView::MakeVisible( const Rectangle& rRect, Window& rWin )
{
//! rWin richtig auswerten
//! ggf Zoom aendern
if ( pViewData && pViewData->GetActiveWin() == &rWin )
pViewData->GetView()->MakeVisible( rRect );
}
SdrEndTextEditKind ScDrawView::ScEndTextEdit()
{
BOOL bIsTextEdit = IsTextEdit();
SdrEndTextEditKind eKind = SdrEndTextEdit();
2000-09-18 16:07:07 +00:00
if ( bIsTextEdit && pViewData )
pViewData->GetViewShell()->SetDrawTextUndo(NULL); // "normaler" Undo-Manager
return eKind;
}
void ScDrawView::MarkDropObj( SdrObject* pObj )
{
if ( pDropMarkObj != pObj )
2000-09-18 16:07:07 +00:00
{
pDropMarkObj = pObj;
ImplClearCalcDropMarker();
if(pDropMarkObj)
2000-09-18 16:07:07 +00:00
{
pDropMarker = new SdrDropMarkerOverlay(*this, *pDropMarkObj);
2000-09-18 16:07:07 +00:00
}
}
}
void ScDrawView::StoreCaptionAttribs()
{
SdrObject* pObj = NULL;
const SdrMarkList& rMarkList = GetMarkedObjectList();
if( rMarkList.GetMarkCount() == 1 )
pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
if ( pObj && pObj->GetLayer() == SC_LAYER_INTERN && pObj->ISA(SdrCaptionObj) )
{
ScAddress aTabPos;
ScDrawObjData* pData = ScDrawLayer::GetObjData( pObj );
if( pData )
aTabPos = pData->aStt;
ScPostIt aNote(pDoc);
if(pDoc->GetNote( aTabPos.Col(), aTabPos.Row(), aTabPos.Tab(), aNote ))
{
aNote.SetItemSet(pObj->GetMergedItemSet());
pDoc->SetNote( aTabPos.Col(), aTabPos.Row(), aTabPos.Tab(), aNote );
}
}
}
void ScDrawView::StoreCaptionDimensions()
{
SdrObject* pObj = NULL;
const SdrMarkList& rMarkList = GetMarkedObjectList();
2000-09-18 16:07:07 +00:00
if( rMarkList.GetMarkCount() == 1 )
pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
2000-09-18 16:07:07 +00:00
if ( pObj && pObj->GetLayer() == SC_LAYER_INTERN && pObj->ISA(SdrCaptionObj) )
{
ScAddress aTabPos;
ScDrawObjData* pData = ScDrawLayer::GetObjData( pObj );
if( pData )
aTabPos = pData->aStt;
ScPostIt aNote(pDoc);
if(pDoc->GetNote( aTabPos.Col(), aTabPos.Row(), aTabPos.Tab(), aNote ))
{
Rectangle aOldRect = aNote.GetRectangle();
Rectangle aNewRect = pObj->GetLogicRect();
if(aOldRect != aNewRect)
{
aNote.SetRectangle(aNewRect);
// The new height/width is honoured if property item is reset.
SdrCaptionObj* pCaption = static_cast<SdrCaptionObj*>(pObj);
OutlinerParaObject* pPObj = pCaption->GetOutlinerParaObject();
bool bVertical = (pPObj && pPObj->IsVertical());
if(!bVertical && aNewRect.Bottom() - aNewRect.Top() > aOldRect.Bottom() - aOldRect.Top())
{
if(pCaption && pCaption->IsAutoGrowHeight())
{
pCaption->SetMergedItem( SdrTextAutoGrowHeightItem( false ) );
aNote.SetItemSet(pCaption->GetMergedItemSet());
}
}
else if(bVertical && aNewRect.Right() - aNewRect.Left() > aOldRect.Right() - aOldRect.Left())
{
if(pCaption && pCaption->IsAutoGrowWidth())
{
pCaption->SetMergedItem( SdrTextAutoGrowWidthItem( false ) );
aNote.SetItemSet(pCaption->GetMergedItemSet());
}
}
pDoc->SetNote( aTabPos.Col(), aTabPos.Row(), aTabPos.Tab(), aNote );
}
}
}
}
void ScDrawView::CaptionTextDirection( USHORT nSlot )
{
if(nSlot != SID_TEXTDIRECTION_LEFT_TO_RIGHT && nSlot != SID_TEXTDIRECTION_TOP_TO_BOTTOM)
return;
SdrObject* pObject = GetTextEditObject();
if ( pObject && pObject->GetLayer() == SC_LAYER_INTERN && pObject->ISA(SdrCaptionObj) )
{
SdrCaptionObj* pCaption = static_cast<SdrCaptionObj*>(pObject);
if(pCaption)
{
SfxItemSet aAttr(pCaption->GetMergedItemSet());
aAttr.Put( SvxWritingModeItem(
nSlot == SID_TEXTDIRECTION_LEFT_TO_RIGHT ?
com::sun::star::text::WritingMode_LR_TB : com::sun::star::text::WritingMode_TB_RL,
SDRATTR_TEXTDIRECTION ) );
pCaption->SetMergedItemSet(aAttr);
FuPoor* pPoor = pViewData->GetView()->GetDrawFuncPtr();
if ( pPoor )
{
FuText* pText = static_cast<FuText*>(pPoor);
pText->StopEditMode(TRUE);
}
}
}
}