xref: /aoo42x/main/sd/source/ui/docshell/sdclient.cxx (revision 5b190011)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 #include "Client.hxx"
28 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
29 #include <svx/svdoole2.hxx>
30 #include <svx/svdograf.hxx>
31 #include <svx/svdpagv.hxx>
32 
33 #include <toolkit/helper/vclunohelper.hxx>
34 
35 
36 #include "misc.hxx"
37 
38 #ifdef STARIMAGE_AVAILABLE
39 #ifndef _SIMDLL_HXX
40 #include <sim2/simdll.hxx>
41 #endif
42 #endif
43 
44 #include "strings.hrc"
45 #include "ViewShell.hxx"
46 #include "DrawViewShell.hxx"
47 #include "View.hxx"
48 #include "Window.hxx"
49 #include "sdresid.hxx"
50 #include <vcl/svapp.hxx>
51 
52 using namespace com::sun::star;
53 
54 namespace sd {
55 
56 /*************************************************************************
57 |*
58 |* Ctor
59 |*
60 \************************************************************************/
61 
62 Client::Client(SdrOle2Obj* pObj, ViewShell* pViewShell, ::Window* pWindow) :
63     SfxInPlaceClient(pViewShell->GetViewShell(), pWindow, pObj->GetAspect() ),
64 	mpViewShell(pViewShell),
65 	pSdrOle2Obj(pObj),
66 	pSdrGrafObj(NULL),
67 	pOutlinerParaObj (NULL)
68 {
69     SetObject( pObj->GetObjRef() );
70     DBG_ASSERT( GetObject().is(), "No object connected!" );
71 }
72 
73 /*************************************************************************
74 |*
75 |* Dtor
76 |*
77 \************************************************************************/
78 
79 Client::~Client()
80 {
81 }
82 
83 
84 /*************************************************************************
85 |*
86 |* Wenn IP-aktiv, dann kommt diese Anforderung um Vergroesserung des
87 |* sichtbaren Ausschnitts des Objektes
88 |*
89 \************************************************************************/
90 
91 void Client::RequestNewObjectArea( Rectangle& aObjRect )
92 {
93     ::sd::View* pView = mpViewShell->GetView();
94 
95 	sal_Bool bSizeProtect = sal_False;
96 	sal_Bool bPosProtect = sal_False;
97 
98 	const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
99 	if (rMarkList.GetMarkCount() == 1)
100 	{
101 		SdrMark* pMark = rMarkList.GetMark(0);
102 		SdrObject* pObj = pMark->GetMarkedSdrObj();
103 
104         // no need to check for changes, this method is called only if the area really changed
105         bSizeProtect = pObj->IsResizeProtect();
106         bPosProtect = pObj->IsMoveProtect();
107 	}
108 
109 	Rectangle aOldRect = GetObjArea();
110 	if ( bPosProtect )
111 		aObjRect.SetPos( aOldRect.TopLeft() );
112 
113 	if ( bSizeProtect )
114 		aObjRect.SetSize( aOldRect.GetSize() );
115 
116 	Rectangle aWorkArea( pView->GetWorkArea() );
117 	if ( !aWorkArea.IsInside(aObjRect) && !bPosProtect && aObjRect != aOldRect )
118 	{
119         // correct position
120 		Point aPos = aObjRect.TopLeft();
121 		Size  aSize = aObjRect.GetSize();
122 		Point aWorkAreaTL = aWorkArea.TopLeft();
123 		Point aWorkAreaBR = aWorkArea.BottomRight();
124 
125 		aPos.X() = Max(aPos.X(), aWorkAreaTL.X());
126 		aPos.X() = Min(aPos.X(), aWorkAreaBR.X()-aSize.Width());
127 		aPos.Y() = Max(aPos.Y(), aWorkAreaTL.Y());
128 		aPos.Y() = Min(aPos.Y(), aWorkAreaBR.Y()-aSize.Height());
129 
130 		aObjRect.SetPos(aPos);
131     }
132 }
133 
134 void Client::ObjectAreaChanged()
135 {
136     ::sd::View* pView = mpViewShell->GetView();
137 	const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
138 	if (rMarkList.GetMarkCount() == 1)
139 	{
140 		SdrMark* pMark = rMarkList.GetMark(0);
141 		SdrOle2Obj* pObj = dynamic_cast< SdrOle2Obj* >(pMark->GetMarkedSdrObj());
142 
143         if(pObj)
144         {
145             // no need to check for changes, this method is called only if the area really changed
146             Rectangle aNewRectangle(GetScaledObjArea());
147 
148             // #i118524# if sheared/rotated, center to non-rotated LogicRect
149             pObj->setSuppressSetVisAreaSize(true);
150 
151             if(pObj->GetGeoStat().nDrehWink || pObj->GetGeoStat().nShearWink)
152             {
153                 pObj->SetLogicRect( aNewRectangle );
154 
155                 const Rectangle& rBoundRect = pObj->GetCurrentBoundRect();
156                 const Point aDelta(aNewRectangle.Center() - rBoundRect.Center());
157 
158                 aNewRectangle.Move(aDelta.X(), aDelta.Y());
159             }
160 
161             pObj->SetLogicRect( aNewRectangle );
162             pObj->setSuppressSetVisAreaSize(false);
163         }
164 	}
165 }
166 
167 /*************************************************************************
168 |*
169 |*
170 |*
171 \************************************************************************/
172 
173 void Client::ViewChanged()
174 {
175 	if ( GetAspect() == embed::Aspects::MSOLE_ICON )
176 	{
177 		// the iconified object seems not to need such a scaling handling
178 		// since the replacement image and the size a completely controlled by the container
179 		// TODO/LATER: when the icon exchange is implemented the scaling handling might be required again here
180 
181 		pSdrOle2Obj->ActionChanged(); // draw needs it to remove lines in slide preview
182 		return;
183 	}
184 
185     //TODO/LATER: should we try to avoid the recalculation of the visareasize
186     //if we know that it didn't change?
187     if (mpViewShell->GetActiveWindow())
188 	{
189 		::sd::View* pView = mpViewShell->GetView();
190 		if (pView)
191 		{
192             Rectangle aLogicRect( pSdrOle2Obj->GetLogicRect() );
193             Size aLogicSize( aLogicRect.GetWidth(), aLogicRect.GetHeight() );
194 
195             if( pSdrOle2Obj->IsChart() )
196             {
197                 //charts never should be stretched see #i84323# for example
198                 pSdrOle2Obj->SetLogicRect( Rectangle( aLogicRect.TopLeft(), aLogicSize ) );
199                 pSdrOle2Obj->BroadcastObjectChange();
200                 return;
201             }
202 
203             // TODO/LEAN: maybe we can do this without requesting the VisualArea?
204             // working with the visual area might need running state, so the object may switch itself to this state
205             MapMode             aMap100( MAP_100TH_MM );
206             Rectangle           aVisArea;
207             Size aSize = pSdrOle2Obj->GetOrigObjSize( &aMap100 );
208 
209             aVisArea.SetSize( aSize );
210             Size                aScaledSize( static_cast< long >( GetScaleWidth() * Fraction( aVisArea.GetWidth() ) ),
211                                                 static_cast< long >( GetScaleHeight() * Fraction( aVisArea.GetHeight() ) ) );
212 
213             // react to the change if the difference is bigger than one pixel
214             Size aPixelDiff =
215                 Application::GetDefaultDevice()->LogicToPixel(
216                     Size( aLogicRect.GetWidth() - aScaledSize.Width(),
217                           aLogicRect.GetHeight() - aScaledSize.Height() ),
218                     aMap100 );
219             if( aPixelDiff.Width() || aPixelDiff.Height() )
220             {
221                 pSdrOle2Obj->SetLogicRect( Rectangle( aLogicRect.TopLeft(), aScaledSize ) );
222                 pSdrOle2Obj->BroadcastObjectChange();
223             }
224             else
225                 pSdrOle2Obj->ActionChanged();
226 		}
227 	}
228 }
229 
230 
231 /*************************************************************************
232 |*
233 |* Objekt in den sichtbaren Breich scrollen
234 |*
235 \************************************************************************/
236 
237 void Client::MakeVisible()
238 {
239 	if (mpViewShell->ISA(DrawViewShell))
240 	{
241 		static_cast<DrawViewShell*>(mpViewShell)->MakeVisible(
242             pSdrOle2Obj->GetLogicRect(),
243             *mpViewShell->GetActiveWindow());
244 	}
245 }
246 
247 } // end of namespace sd
248 
249