1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sc.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir // INCLUDE --------------------------------------------------------------- 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir #include <com/sun/star/embed/XEmbeddedObject.hpp> 35*cdf0e10cSrcweir #include <com/sun/star/embed/NoVisualAreaSizeException.hpp> 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx> 38*cdf0e10cSrcweir #include <sfx2/objsh.hxx> 39*cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 40*cdf0e10cSrcweir #include <sot/sotref.hxx> 41*cdf0e10cSrcweir #include <svx/svditer.hxx> 42*cdf0e10cSrcweir #include <svx/svdobj.hxx> 43*cdf0e10cSrcweir #include <svx/svdmodel.hxx> 44*cdf0e10cSrcweir #include <svx/svdpage.hxx> 45*cdf0e10cSrcweir #include <svx/svdoole2.hxx> 46*cdf0e10cSrcweir #include <svx/svdview.hxx> 47*cdf0e10cSrcweir #include <svx/svdograf.hxx> 48*cdf0e10cSrcweir #include <svtools/embedhlp.hxx> 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir #include "client.hxx" 51*cdf0e10cSrcweir #include "tabvwsh.hxx" 52*cdf0e10cSrcweir #include "docsh.hxx" 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir using namespace com::sun::star; 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir //------------------------------------------------------------------------ 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir ScClient::ScClient( ScTabViewShell* pViewShell, Window* pDraw, SdrModel* pSdrModel, SdrOle2Obj* pObj ) : 59*cdf0e10cSrcweir SfxInPlaceClient( pViewShell, pDraw, pObj->GetAspect() ), 60*cdf0e10cSrcweir pModel( pSdrModel ), 61*cdf0e10cSrcweir pGrafEdit( 0 ) 62*cdf0e10cSrcweir { 63*cdf0e10cSrcweir SetObject( pObj->GetObjRef() ); 64*cdf0e10cSrcweir } 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir __EXPORT ScClient::~ScClient() 67*cdf0e10cSrcweir { 68*cdf0e10cSrcweir } 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir SdrOle2Obj* ScClient::GetDrawObj() 71*cdf0e10cSrcweir { 72*cdf0e10cSrcweir uno::Reference < embed::XEmbeddedObject > xObj = GetObject(); 73*cdf0e10cSrcweir SdrOle2Obj* pOle2Obj = NULL; 74*cdf0e10cSrcweir String aName = GetViewShell()->GetObjectShell()->GetEmbeddedObjectContainer().GetEmbeddedObjectName( xObj ); 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir sal_uInt16 nPages = pModel->GetPageCount(); 77*cdf0e10cSrcweir for (sal_uInt16 nPNr=0; nPNr<nPages && !pOle2Obj; nPNr++) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir SdrPage* pPage = pModel->GetPage(nPNr); 80*cdf0e10cSrcweir SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); 81*cdf0e10cSrcweir SdrObject* pObject = aIter.Next(); 82*cdf0e10cSrcweir while (pObject && !pOle2Obj) 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir if ( pObject->GetObjIdentifier() == OBJ_OLE2 ) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir // name from InfoObject is PersistName 87*cdf0e10cSrcweir if ( ((SdrOle2Obj*)pObject)->GetPersistName() == aName ) 88*cdf0e10cSrcweir pOle2Obj = (SdrOle2Obj*)pObject; 89*cdf0e10cSrcweir } 90*cdf0e10cSrcweir pObject = aIter.Next(); 91*cdf0e10cSrcweir } 92*cdf0e10cSrcweir } 93*cdf0e10cSrcweir return pOle2Obj; 94*cdf0e10cSrcweir } 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir void __EXPORT ScClient::RequestNewObjectArea( Rectangle& aLogicRect ) 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir SfxViewShell* pSfxViewSh = GetViewShell(); 99*cdf0e10cSrcweir ScTabViewShell* pViewSh = PTR_CAST( ScTabViewShell, pSfxViewSh ); 100*cdf0e10cSrcweir if (!pViewSh) 101*cdf0e10cSrcweir { 102*cdf0e10cSrcweir DBG_ERROR("Wrong ViewShell"); 103*cdf0e10cSrcweir return; 104*cdf0e10cSrcweir } 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir Rectangle aOldRect = GetObjArea(); 107*cdf0e10cSrcweir SdrOle2Obj* pDrawObj = GetDrawObj(); 108*cdf0e10cSrcweir if ( pDrawObj ) 109*cdf0e10cSrcweir { 110*cdf0e10cSrcweir if ( pDrawObj->IsResizeProtect() ) 111*cdf0e10cSrcweir aLogicRect.SetSize( aOldRect.GetSize() ); 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir if ( pDrawObj->IsMoveProtect() ) 114*cdf0e10cSrcweir aLogicRect.SetPos( aOldRect.TopLeft() ); 115*cdf0e10cSrcweir } 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir sal_uInt16 nTab = pViewSh->GetViewData()->GetTabNo(); 118*cdf0e10cSrcweir SdrPage* pPage = pModel->GetPage(static_cast<sal_uInt16>(static_cast<sal_Int16>(nTab))); 119*cdf0e10cSrcweir if ( pPage && aLogicRect != aOldRect ) 120*cdf0e10cSrcweir { 121*cdf0e10cSrcweir Point aPos; 122*cdf0e10cSrcweir Size aSize = pPage->GetSize(); 123*cdf0e10cSrcweir if ( aSize.Width() < 0 ) 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir aPos.X() = aSize.Width() + 1; // negative 126*cdf0e10cSrcweir aSize.Width() = -aSize.Width(); // positive 127*cdf0e10cSrcweir } 128*cdf0e10cSrcweir Rectangle aPageRect( aPos, aSize ); 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir if (aLogicRect.Right() > aPageRect.Right()) 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir long nDiff = aLogicRect.Right() - aPageRect.Right(); 133*cdf0e10cSrcweir aLogicRect.Left() -= nDiff; 134*cdf0e10cSrcweir aLogicRect.Right() -= nDiff; 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir if (aLogicRect.Bottom() > aPageRect.Bottom()) 137*cdf0e10cSrcweir { 138*cdf0e10cSrcweir long nDiff = aLogicRect.Bottom() - aPageRect.Bottom(); 139*cdf0e10cSrcweir aLogicRect.Top() -= nDiff; 140*cdf0e10cSrcweir aLogicRect.Bottom() -= nDiff; 141*cdf0e10cSrcweir } 142*cdf0e10cSrcweir 143*cdf0e10cSrcweir if (aLogicRect.Left() < aPageRect.Left()) 144*cdf0e10cSrcweir { 145*cdf0e10cSrcweir long nDiff = aLogicRect.Left() - aPageRect.Left(); 146*cdf0e10cSrcweir aLogicRect.Right() -= nDiff; 147*cdf0e10cSrcweir aLogicRect.Left() -= nDiff; 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir if (aLogicRect.Top() < aPageRect.Top()) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir long nDiff = aLogicRect.Top() - aPageRect.Top(); 152*cdf0e10cSrcweir aLogicRect.Bottom() -= nDiff; 153*cdf0e10cSrcweir aLogicRect.Top() -= nDiff; 154*cdf0e10cSrcweir } 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir } 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir void __EXPORT ScClient::ObjectAreaChanged() 159*cdf0e10cSrcweir { 160*cdf0e10cSrcweir SfxViewShell* pSfxViewSh = GetViewShell(); 161*cdf0e10cSrcweir ScTabViewShell* pViewSh = PTR_CAST( ScTabViewShell, pSfxViewSh ); 162*cdf0e10cSrcweir if (!pViewSh) 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir DBG_ERROR("Wrong ViewShell"); 165*cdf0e10cSrcweir return; 166*cdf0e10cSrcweir } 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir // Position und Groesse ins Dokument uebernehmen 169*cdf0e10cSrcweir SdrOle2Obj* pDrawObj = GetDrawObj(); 170*cdf0e10cSrcweir if (pDrawObj) 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir pDrawObj->SetLogicRect( GetScaledObjArea() ); 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir // set document modified (SdrModel::SetChanged is not used) 175*cdf0e10cSrcweir // TODO/LATER: is there a reason that this code is not executed in Draw? 176*cdf0e10cSrcweir // SfxViewShell* pSfxViewSh = GetViewShell(); 177*cdf0e10cSrcweir // ScTabViewShell* pViewSh = PTR_CAST( ScTabViewShell, pSfxViewSh ); 178*cdf0e10cSrcweir if (pViewSh) 179*cdf0e10cSrcweir pViewSh->GetViewData()->GetDocShell()->SetDrawModified(); 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir if (pDrawObj) 183*cdf0e10cSrcweir pViewSh->ScrollToObject( pDrawObj ); 184*cdf0e10cSrcweir } 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir void __EXPORT ScClient::ViewChanged() 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir if ( GetAspect() == embed::Aspects::MSOLE_ICON ) 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir // the iconified object seems not to need such a scaling handling 191*cdf0e10cSrcweir // since the replacement image and the size a completely controlled by the container 192*cdf0e10cSrcweir // TODO/LATER: when the icon exchange is implemented the scaling handling might be required again here 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir return; 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir uno::Reference < embed::XEmbeddedObject > xObj = GetObject(); 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir // TODO/LEAN: working with Visual Area can switch object to running state 200*cdf0e10cSrcweir awt::Size aSz; 201*cdf0e10cSrcweir try { 202*cdf0e10cSrcweir aSz = xObj->getVisualAreaSize( GetAspect() ); 203*cdf0e10cSrcweir } catch ( embed::NoVisualAreaSizeException& ) 204*cdf0e10cSrcweir { 205*cdf0e10cSrcweir DBG_ERROR("The visual area size must be available!\n"); 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( GetAspect() ) ); 209*cdf0e10cSrcweir Size aVisSize = OutputDevice::LogicToLogic( Size( aSz.Width, aSz.Height ), aMapUnit, MAP_100TH_MM ); 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir // Groesse ins Dokument uebernehmen 212*cdf0e10cSrcweir SdrOle2Obj* pDrawObj = GetDrawObj(); 213*cdf0e10cSrcweir if (pDrawObj) 214*cdf0e10cSrcweir { 215*cdf0e10cSrcweir Rectangle aLogicRect = pDrawObj->GetLogicRect(); 216*cdf0e10cSrcweir Fraction aFractX = GetScaleWidth(); 217*cdf0e10cSrcweir Fraction aFractY = GetScaleHeight(); 218*cdf0e10cSrcweir aFractX *= aVisSize.Width(); 219*cdf0e10cSrcweir aFractY *= aVisSize.Height(); 220*cdf0e10cSrcweir aVisSize = Size( (long) aFractX, (long) aFractY ); // skaliert fuer Draw-Model 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir // pClientData->SetObjArea vor pDrawObj->SetLogicRect, damit keine 223*cdf0e10cSrcweir // falschen Skalierungen ausgerechnet werden: 224*cdf0e10cSrcweir //Rectangle aObjArea = aLogicRect; 225*cdf0e10cSrcweir //aObjArea.SetSize( aVisSize ); // Dokument-Groesse vom Server 226*cdf0e10cSrcweir //SetObjArea( aObjArea ); 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir SfxViewShell* pSfxViewSh = GetViewShell(); 229*cdf0e10cSrcweir ScTabViewShell* pViewSh = PTR_CAST( ScTabViewShell, pSfxViewSh ); 230*cdf0e10cSrcweir if ( pViewSh ) 231*cdf0e10cSrcweir { 232*cdf0e10cSrcweir Window* pWin = pViewSh->GetActiveWin(); 233*cdf0e10cSrcweir if ( pWin->LogicToPixel( aVisSize ) != pWin->LogicToPixel( aLogicRect.GetSize() ) ) 234*cdf0e10cSrcweir { 235*cdf0e10cSrcweir aLogicRect.SetSize( aVisSize ); 236*cdf0e10cSrcweir pDrawObj->SetLogicRect( aLogicRect ); 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir // set document modified (SdrModel::SetChanged is not used) 239*cdf0e10cSrcweir pViewSh->GetViewData()->GetDocShell()->SetDrawModified(); 240*cdf0e10cSrcweir } 241*cdf0e10cSrcweir } 242*cdf0e10cSrcweir } 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir 245*cdf0e10cSrcweir void __EXPORT ScClient::MakeVisible() 246*cdf0e10cSrcweir { 247*cdf0e10cSrcweir SdrOle2Obj* pDrawObj = GetDrawObj(); 248*cdf0e10cSrcweir if (pDrawObj) 249*cdf0e10cSrcweir { 250*cdf0e10cSrcweir SfxViewShell* pSfxViewSh = GetViewShell(); 251*cdf0e10cSrcweir ScTabViewShell* pViewSh = PTR_CAST( ScTabViewShell, pSfxViewSh ); 252*cdf0e10cSrcweir if (pViewSh) 253*cdf0e10cSrcweir pViewSh->ScrollToObject( pDrawObj ); 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir 257