1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx"
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include "PresenterTextView.hxx"
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <i18npool/mslangid.hxx>
29*b1cdbd2cSJim Jagielski #include <cppcanvas/vclfactory.hxx>
30*b1cdbd2cSJim Jagielski #include <svl/itempool.hxx>
31*b1cdbd2cSJim Jagielski #include <svl/itemset.hxx>
32*b1cdbd2cSJim Jagielski #include <unotools/linguprops.hxx>
33*b1cdbd2cSJim Jagielski #include <unotools/lingucfg.hxx>
34*b1cdbd2cSJim Jagielski #include <editeng/colritem.hxx>
35*b1cdbd2cSJim Jagielski #include <editeng/editeng.hxx>
36*b1cdbd2cSJim Jagielski #include <editeng/editstat.hxx>
37*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
38*b1cdbd2cSJim Jagielski #include <editeng/fhgtitem.hxx>
39*b1cdbd2cSJim Jagielski #include <editeng/fontitem.hxx>
40*b1cdbd2cSJim Jagielski #include <svx/xflclit.hxx>
41*b1cdbd2cSJim Jagielski #include <vcl/bitmapex.hxx>
42*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
43*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontDescriptor.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/Size.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/XSpriteCanvas.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/util/Color.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/ScriptType.hpp>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
53*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
54*b1cdbd2cSJim Jagielski using ::rtl::OUString;
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski namespace sd { namespace presenter {
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski //===== Service ===============================================================
59*b1cdbd2cSJim Jagielski 
PresenterTextViewService_createInstance(const Reference<XComponentContext> & rxContext)60*b1cdbd2cSJim Jagielski Reference<XInterface> SAL_CALL PresenterTextViewService_createInstance (
61*b1cdbd2cSJim Jagielski     const Reference<XComponentContext>& rxContext)
62*b1cdbd2cSJim Jagielski {
63*b1cdbd2cSJim Jagielski     return Reference<XInterface>(static_cast<XWeak*>(new PresenterTextView(rxContext)));
64*b1cdbd2cSJim Jagielski }
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 
PresenterTextViewService_getImplementationName(void)69*b1cdbd2cSJim Jagielski ::rtl::OUString PresenterTextViewService_getImplementationName (void) throw(RuntimeException)
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski     return OUString::createFromAscii("com.sun.star.comp.Draw.PresenterTextView");
72*b1cdbd2cSJim Jagielski }
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 
PresenterTextViewService_getSupportedServiceNames(void)77*b1cdbd2cSJim Jagielski Sequence<rtl::OUString> SAL_CALL PresenterTextViewService_getSupportedServiceNames (void)
78*b1cdbd2cSJim Jagielski     throw (RuntimeException)
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski 	static const ::rtl::OUString sServiceName(
81*b1cdbd2cSJim Jagielski         ::rtl::OUString::createFromAscii("com.sun.star.drawing.PresenterTextView"));
82*b1cdbd2cSJim Jagielski 	return Sequence<rtl::OUString>(&sServiceName, 1);
83*b1cdbd2cSJim Jagielski }
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski //===== PresenterTextView::Implementation =====================================
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski class PresenterTextView::Implementation
90*b1cdbd2cSJim Jagielski {
91*b1cdbd2cSJim Jagielski public:
92*b1cdbd2cSJim Jagielski     const OUString msTextPropertyName;
93*b1cdbd2cSJim Jagielski     const OUString msBitmapPropertyName;
94*b1cdbd2cSJim Jagielski     const OUString msSizePropertyName;
95*b1cdbd2cSJim Jagielski     const OUString msBackgroundColorPropertyName;
96*b1cdbd2cSJim Jagielski     const OUString msTextColorPropertyName;
97*b1cdbd2cSJim Jagielski     const OUString msFontDescriptorPropertyName;
98*b1cdbd2cSJim Jagielski     const OUString msTopPropertyName;
99*b1cdbd2cSJim Jagielski     const OUString msTopRelativePropertyName;
100*b1cdbd2cSJim Jagielski     const OUString msTotalHeightPropertyName;
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     Implementation (void);
103*b1cdbd2cSJim Jagielski     ~Implementation (void);
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski     void SetCanvas (const cppcanvas::CanvasSharedPtr& rCanvas);
106*b1cdbd2cSJim Jagielski     void SetSize (const Size aSize);
107*b1cdbd2cSJim Jagielski     void SetBackgroundColor (const Color aColor);
108*b1cdbd2cSJim Jagielski     void SetTextColor (const Color aColor);
109*b1cdbd2cSJim Jagielski     void SetFontDescriptor (const awt::FontDescriptor& rFontDescriptor);
110*b1cdbd2cSJim Jagielski     sal_Int32 GetTop (void) const;
111*b1cdbd2cSJim Jagielski     void SetTop (const sal_Int32 nTop);
112*b1cdbd2cSJim Jagielski     void SetText (const OUString& Text);
113*b1cdbd2cSJim Jagielski     sal_Int32 ParseDistance (const OUString& rsDistance) const;
114*b1cdbd2cSJim Jagielski     Reference<rendering::XBitmap> GetBitmap (void);
115*b1cdbd2cSJim Jagielski     sal_Int32 GetTotalHeight (void);
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski private:
118*b1cdbd2cSJim Jagielski     Reference<rendering::XBitmap> mxBitmap;
119*b1cdbd2cSJim Jagielski     cppcanvas::CanvasSharedPtr mpCanvas;
120*b1cdbd2cSJim Jagielski     VirtualDevice* mpOutputDevice;
121*b1cdbd2cSJim Jagielski     EditEngine* mpEditEngine;
122*b1cdbd2cSJim Jagielski     SfxItemPool* mpEditEngineItemPool;
123*b1cdbd2cSJim Jagielski     Size maSize;
124*b1cdbd2cSJim Jagielski     Color maBackgroundColor;
125*b1cdbd2cSJim Jagielski     Color maTextColor;
126*b1cdbd2cSJim Jagielski     String msText;
127*b1cdbd2cSJim Jagielski     sal_Int32 mnTop;
128*b1cdbd2cSJim Jagielski     sal_Int32 mnTotalHeight;
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski     EditEngine * GetEditEngine (void);
131*b1cdbd2cSJim Jagielski     EditEngine* CreateEditEngine (void);
132*b1cdbd2cSJim Jagielski     void CheckTop (void);
133*b1cdbd2cSJim Jagielski };
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski //===== PresenterTextView =====================================================
139*b1cdbd2cSJim Jagielski 
PresenterTextView(const Reference<XComponentContext> & rxContext)140*b1cdbd2cSJim Jagielski PresenterTextView::PresenterTextView (const Reference<XComponentContext>& rxContext)
141*b1cdbd2cSJim Jagielski     : PresenterTextViewInterfaceBase(),
142*b1cdbd2cSJim Jagielski       mpImplementation(new Implementation())
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski     (void)rxContext;
145*b1cdbd2cSJim Jagielski }
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 
~PresenterTextView(void)150*b1cdbd2cSJim Jagielski PresenterTextView::~PresenterTextView (void)
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski }
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 
disposing(void)157*b1cdbd2cSJim Jagielski void SAL_CALL PresenterTextView::disposing (void)
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski     mpImplementation.reset();
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski //----- XInitialization -------------------------------------------------------
166*b1cdbd2cSJim Jagielski 
initialize(const Sequence<Any> & rArguments)167*b1cdbd2cSJim Jagielski void SAL_CALL PresenterTextView::initialize (const Sequence<Any>& rArguments)
168*b1cdbd2cSJim Jagielski     throw (Exception, RuntimeException)
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski     if (rArguments.getLength() == 1)
173*b1cdbd2cSJim Jagielski     {
174*b1cdbd2cSJim Jagielski         try
175*b1cdbd2cSJim Jagielski         {
176*b1cdbd2cSJim Jagielski             Reference<rendering::XBitmapCanvas> xCanvas (rArguments[0], UNO_QUERY_THROW);
177*b1cdbd2cSJim Jagielski             if (xCanvas.is())
178*b1cdbd2cSJim Jagielski             {
179*b1cdbd2cSJim Jagielski                 mpImplementation->SetCanvas(
180*b1cdbd2cSJim Jagielski                     cppcanvas::VCLFactory::getInstance().createCanvas(xCanvas));
181*b1cdbd2cSJim Jagielski             }
182*b1cdbd2cSJim Jagielski         }
183*b1cdbd2cSJim Jagielski         catch (RuntimeException&)
184*b1cdbd2cSJim Jagielski         {
185*b1cdbd2cSJim Jagielski             throw;
186*b1cdbd2cSJim Jagielski         }
187*b1cdbd2cSJim Jagielski     }
188*b1cdbd2cSJim Jagielski     else
189*b1cdbd2cSJim Jagielski     {
190*b1cdbd2cSJim Jagielski         throw RuntimeException(
191*b1cdbd2cSJim Jagielski             OUString::createFromAscii("PresenterTextView: invalid number of arguments"),
192*b1cdbd2cSJim Jagielski                 static_cast<XWeak*>(this));
193*b1cdbd2cSJim Jagielski     }
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
200*b1cdbd2cSJim Jagielski 
GetPropertyValue(const OUString & rsPropertyName)201*b1cdbd2cSJim Jagielski Any PresenterTextView::GetPropertyValue (const OUString& rsPropertyName)
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski     if (rsPropertyName == mpImplementation->msBitmapPropertyName)
206*b1cdbd2cSJim Jagielski     {
207*b1cdbd2cSJim Jagielski         return Any(mpImplementation->GetBitmap());
208*b1cdbd2cSJim Jagielski     }
209*b1cdbd2cSJim Jagielski     else if (rsPropertyName == mpImplementation->msTopPropertyName)
210*b1cdbd2cSJim Jagielski     {
211*b1cdbd2cSJim Jagielski         return Any(mpImplementation->GetTop());
212*b1cdbd2cSJim Jagielski     }
213*b1cdbd2cSJim Jagielski     else if (rsPropertyName == mpImplementation->msTotalHeightPropertyName)
214*b1cdbd2cSJim Jagielski     {
215*b1cdbd2cSJim Jagielski         return Any(mpImplementation->GetTotalHeight());
216*b1cdbd2cSJim Jagielski     }
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski     return Any();
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski 
SetPropertyValue(const::rtl::OUString & rsPropertyName,const css::uno::Any & rValue)224*b1cdbd2cSJim Jagielski Any PresenterTextView::SetPropertyValue (
225*b1cdbd2cSJim Jagielski     const ::rtl::OUString& rsPropertyName,
226*b1cdbd2cSJim Jagielski     const css::uno::Any& rValue)
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski     Any aOldValue;
231*b1cdbd2cSJim Jagielski     if (rsPropertyName == mpImplementation->msTextPropertyName)
232*b1cdbd2cSJim Jagielski     {
233*b1cdbd2cSJim Jagielski         OUString sText;
234*b1cdbd2cSJim Jagielski         if (rValue >>= sText)
235*b1cdbd2cSJim Jagielski             mpImplementation->SetText(sText);
236*b1cdbd2cSJim Jagielski     }
237*b1cdbd2cSJim Jagielski     else if (rsPropertyName == mpImplementation->msSizePropertyName)
238*b1cdbd2cSJim Jagielski     {
239*b1cdbd2cSJim Jagielski         awt::Size aSize;
240*b1cdbd2cSJim Jagielski         if (rValue >>= aSize)
241*b1cdbd2cSJim Jagielski             mpImplementation->SetSize(Size(aSize.Width,aSize.Height));
242*b1cdbd2cSJim Jagielski     }
243*b1cdbd2cSJim Jagielski     else if (rsPropertyName == mpImplementation->msBackgroundColorPropertyName)
244*b1cdbd2cSJim Jagielski     {
245*b1cdbd2cSJim Jagielski         util::Color aColor = util::Color();
246*b1cdbd2cSJim Jagielski         if (rValue >>= aColor)
247*b1cdbd2cSJim Jagielski             mpImplementation->SetBackgroundColor(Color(aColor));
248*b1cdbd2cSJim Jagielski     }
249*b1cdbd2cSJim Jagielski     else if (rsPropertyName == mpImplementation->msTextColorPropertyName)
250*b1cdbd2cSJim Jagielski     {
251*b1cdbd2cSJim Jagielski         util::Color aColor = util::Color();
252*b1cdbd2cSJim Jagielski         if (rValue >>= aColor)
253*b1cdbd2cSJim Jagielski             mpImplementation->SetTextColor(Color(aColor));
254*b1cdbd2cSJim Jagielski     }
255*b1cdbd2cSJim Jagielski     else if (rsPropertyName == mpImplementation->msFontDescriptorPropertyName)
256*b1cdbd2cSJim Jagielski     {
257*b1cdbd2cSJim Jagielski         awt::FontDescriptor aFontDescriptor;
258*b1cdbd2cSJim Jagielski         if (rValue >>= aFontDescriptor)
259*b1cdbd2cSJim Jagielski             mpImplementation->SetFontDescriptor(aFontDescriptor);
260*b1cdbd2cSJim Jagielski     }
261*b1cdbd2cSJim Jagielski     else if (rsPropertyName == mpImplementation->msTopPropertyName)
262*b1cdbd2cSJim Jagielski     {
263*b1cdbd2cSJim Jagielski         sal_Int32 nTop = 0;
264*b1cdbd2cSJim Jagielski         if (rValue >>= nTop)
265*b1cdbd2cSJim Jagielski             mpImplementation->SetTop(nTop);
266*b1cdbd2cSJim Jagielski     }
267*b1cdbd2cSJim Jagielski     else if (rsPropertyName == mpImplementation->msTopRelativePropertyName)
268*b1cdbd2cSJim Jagielski     {
269*b1cdbd2cSJim Jagielski         OUString sDistance;
270*b1cdbd2cSJim Jagielski         if (rValue >>= sDistance)
271*b1cdbd2cSJim Jagielski             mpImplementation->SetTop(
272*b1cdbd2cSJim Jagielski                 mpImplementation->GetTop()
273*b1cdbd2cSJim Jagielski                     + mpImplementation->ParseDistance(sDistance));
274*b1cdbd2cSJim Jagielski     }
275*b1cdbd2cSJim Jagielski     return aOldValue;
276*b1cdbd2cSJim Jagielski }
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 
ThrowIfDisposed(void)281*b1cdbd2cSJim Jagielski void PresenterTextView::ThrowIfDisposed (void)
282*b1cdbd2cSJim Jagielski     throw (::com::sun::star::lang::DisposedException)
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski 	if (PresenterTextViewInterfaceBase::rBHelper.bDisposed
285*b1cdbd2cSJim Jagielski         || PresenterTextViewInterfaceBase::rBHelper.bInDispose
286*b1cdbd2cSJim Jagielski         || mpImplementation.get()==NULL)
287*b1cdbd2cSJim Jagielski 	{
288*b1cdbd2cSJim Jagielski         throw lang::DisposedException (
289*b1cdbd2cSJim Jagielski             ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
290*b1cdbd2cSJim Jagielski                 "PresenterTextView object has already been disposed")),
291*b1cdbd2cSJim Jagielski             static_cast<uno::XWeak*>(this));
292*b1cdbd2cSJim Jagielski     }
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski //===== PresenterTextView::Implementation =====================================
299*b1cdbd2cSJim Jagielski 
Implementation(void)300*b1cdbd2cSJim Jagielski PresenterTextView::Implementation::Implementation (void)
301*b1cdbd2cSJim Jagielski     : msTextPropertyName(OUString::createFromAscii("Text")),
302*b1cdbd2cSJim Jagielski       msBitmapPropertyName(OUString::createFromAscii("Bitmap")),
303*b1cdbd2cSJim Jagielski       msSizePropertyName(OUString::createFromAscii("Size")),
304*b1cdbd2cSJim Jagielski       msBackgroundColorPropertyName(OUString::createFromAscii("BackgroundColor")),
305*b1cdbd2cSJim Jagielski       msTextColorPropertyName(OUString::createFromAscii("TextColor")),
306*b1cdbd2cSJim Jagielski       msFontDescriptorPropertyName(OUString::createFromAscii("FontDescriptor")),
307*b1cdbd2cSJim Jagielski       msTopPropertyName(OUString::createFromAscii("Top")),
308*b1cdbd2cSJim Jagielski       msTopRelativePropertyName(OUString::createFromAscii("RelativeTop")),
309*b1cdbd2cSJim Jagielski       msTotalHeightPropertyName(OUString::createFromAscii("TotalHeight")),
310*b1cdbd2cSJim Jagielski       mxBitmap(),
311*b1cdbd2cSJim Jagielski       mpCanvas(),
312*b1cdbd2cSJim Jagielski       mpOutputDevice(new VirtualDevice(*Application::GetDefaultDevice(), 0, 0)),
313*b1cdbd2cSJim Jagielski       mpEditEngine(NULL),
314*b1cdbd2cSJim Jagielski       mpEditEngineItemPool(EditEngine::CreatePool()),
315*b1cdbd2cSJim Jagielski       maSize(100,100),
316*b1cdbd2cSJim Jagielski       maBackgroundColor(0xffffffff),
317*b1cdbd2cSJim Jagielski       maTextColor(0x00000000),
318*b1cdbd2cSJim Jagielski       msText(),
319*b1cdbd2cSJim Jagielski       mnTop(0),
320*b1cdbd2cSJim Jagielski       mnTotalHeight(-1)
321*b1cdbd2cSJim Jagielski {
322*b1cdbd2cSJim Jagielski 	mpOutputDevice->SetMapMode(MAP_PIXEL);
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski     GetEditEngine();
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski 
~Implementation(void)330*b1cdbd2cSJim Jagielski PresenterTextView::Implementation::~Implementation (void)
331*b1cdbd2cSJim Jagielski {
332*b1cdbd2cSJim Jagielski     delete mpEditEngine;
333*b1cdbd2cSJim Jagielski     SfxItemPool::Free(mpEditEngineItemPool);
334*b1cdbd2cSJim Jagielski     delete mpOutputDevice;
335*b1cdbd2cSJim Jagielski }
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski 
GetEditEngine(void)340*b1cdbd2cSJim Jagielski EditEngine * PresenterTextView::Implementation::GetEditEngine (void)
341*b1cdbd2cSJim Jagielski {
342*b1cdbd2cSJim Jagielski     if (mpEditEngine == NULL)
343*b1cdbd2cSJim Jagielski         mpEditEngine = CreateEditEngine ();
344*b1cdbd2cSJim Jagielski     return mpEditEngine;
345*b1cdbd2cSJim Jagielski }
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski 
CreateEditEngine(void)350*b1cdbd2cSJim Jagielski EditEngine* PresenterTextView::Implementation::CreateEditEngine (void)
351*b1cdbd2cSJim Jagielski {
352*b1cdbd2cSJim Jagielski     EditEngine* pEditEngine = mpEditEngine;
353*b1cdbd2cSJim Jagielski 	if (pEditEngine == NULL)
354*b1cdbd2cSJim Jagielski 	{
355*b1cdbd2cSJim Jagielski         //
356*b1cdbd2cSJim Jagielski         // set fonts to be used
357*b1cdbd2cSJim Jagielski         //
358*b1cdbd2cSJim Jagielski         SvtLinguOptions aOpt;
359*b1cdbd2cSJim Jagielski         SvtLinguConfig().GetOptions( aOpt );
360*b1cdbd2cSJim Jagielski         //
361*b1cdbd2cSJim Jagielski         struct FontDta {
362*b1cdbd2cSJim Jagielski             sal_Int16       nFallbackLang;
363*b1cdbd2cSJim Jagielski             sal_Int16       nLang;
364*b1cdbd2cSJim Jagielski             sal_uInt16      nFontType;
365*b1cdbd2cSJim Jagielski             sal_uInt16      nFontInfoId;
366*b1cdbd2cSJim Jagielski             } aTable[3] =
367*b1cdbd2cSJim Jagielski         {
368*b1cdbd2cSJim Jagielski             // info to get western font to be used
369*b1cdbd2cSJim Jagielski             {   LANGUAGE_ENGLISH_US,    LANGUAGE_NONE,
370*b1cdbd2cSJim Jagielski                 DEFAULTFONT_SERIF,      EE_CHAR_FONTINFO },
371*b1cdbd2cSJim Jagielski             // info to get CJK font to be used
372*b1cdbd2cSJim Jagielski             {   LANGUAGE_JAPANESE,      LANGUAGE_NONE,
373*b1cdbd2cSJim Jagielski                 DEFAULTFONT_CJK_TEXT,   EE_CHAR_FONTINFO_CJK },
374*b1cdbd2cSJim Jagielski             // info to get CTL font to be used
375*b1cdbd2cSJim Jagielski             {   LANGUAGE_ARABIC_SAUDI_ARABIA,  LANGUAGE_NONE,
376*b1cdbd2cSJim Jagielski                 DEFAULTFONT_CTL_TEXT,   EE_CHAR_FONTINFO_CTL }
377*b1cdbd2cSJim Jagielski         };
378*b1cdbd2cSJim Jagielski         aTable[0].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage, ::com::sun::star::i18n::ScriptType::LATIN);
379*b1cdbd2cSJim Jagielski         aTable[1].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CJK, ::com::sun::star::i18n::ScriptType::ASIAN);
380*b1cdbd2cSJim Jagielski         aTable[2].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CTL, ::com::sun::star::i18n::ScriptType::COMPLEX);
381*b1cdbd2cSJim Jagielski         //
382*b1cdbd2cSJim Jagielski         for (int i = 0;  i < 3;  ++i)
383*b1cdbd2cSJim Jagielski         {
384*b1cdbd2cSJim Jagielski             const FontDta &rFntDta = aTable[i];
385*b1cdbd2cSJim Jagielski             LanguageType nLang = (LANGUAGE_NONE == rFntDta.nLang) ?
386*b1cdbd2cSJim Jagielski                 rFntDta.nFallbackLang : rFntDta.nLang;
387*b1cdbd2cSJim Jagielski             Font aFont = Application::GetDefaultDevice()->GetDefaultFont(
388*b1cdbd2cSJim Jagielski                 rFntDta.nFontType, nLang, DEFAULTFONT_FLAGS_ONLYONE);
389*b1cdbd2cSJim Jagielski             mpEditEngineItemPool->SetPoolDefaultItem(
390*b1cdbd2cSJim Jagielski                 SvxFontItem(
391*b1cdbd2cSJim Jagielski                     aFont.GetFamily(),
392*b1cdbd2cSJim Jagielski                     aFont.GetName(),
393*b1cdbd2cSJim Jagielski                     aFont.GetStyleName(),
394*b1cdbd2cSJim Jagielski                     aFont.GetPitch(),
395*b1cdbd2cSJim Jagielski                     aFont.GetCharSet(),
396*b1cdbd2cSJim Jagielski                     rFntDta.nFontInfoId));
397*b1cdbd2cSJim Jagielski         }
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski 		pEditEngine = new EditEngine (mpEditEngineItemPool);
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 		pEditEngine->EnableUndo (sal_True);
403*b1cdbd2cSJim Jagielski 		pEditEngine->SetDefTab (sal_uInt16(
404*b1cdbd2cSJim Jagielski 			Application::GetDefaultDevice()->GetTextWidth(
405*b1cdbd2cSJim Jagielski                 UniString::CreateFromAscii("XXXX"))));
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski 		pEditEngine->SetControlWord(
408*b1cdbd2cSJim Jagielski 				(pEditEngine->GetControlWord()
409*b1cdbd2cSJim Jagielski                     | EE_CNTRL_AUTOINDENTING) &
410*b1cdbd2cSJim Jagielski 				(~EE_CNTRL_UNDOATTRIBS) &
411*b1cdbd2cSJim Jagielski 				(~EE_CNTRL_PASTESPECIAL));
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 		pEditEngine->SetWordDelimiters (
414*b1cdbd2cSJim Jagielski             UniString::CreateFromAscii(" .=+-*/(){}[];\""));
415*b1cdbd2cSJim Jagielski 		pEditEngine->SetRefMapMode (MAP_PIXEL);
416*b1cdbd2cSJim Jagielski 		pEditEngine->SetPaperSize (Size(800, 0));
417*b1cdbd2cSJim Jagielski 		pEditEngine->EraseVirtualDevice();
418*b1cdbd2cSJim Jagielski 		pEditEngine->ClearModifyFlag();
419*b1cdbd2cSJim Jagielski 	}
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski 	return pEditEngine;
422*b1cdbd2cSJim Jagielski }
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski 
SetCanvas(const cppcanvas::CanvasSharedPtr & rpCanvas)427*b1cdbd2cSJim Jagielski void PresenterTextView::Implementation::SetCanvas (const cppcanvas::CanvasSharedPtr& rpCanvas)
428*b1cdbd2cSJim Jagielski {
429*b1cdbd2cSJim Jagielski     mpCanvas = rpCanvas;
430*b1cdbd2cSJim Jagielski     mxBitmap = NULL;
431*b1cdbd2cSJim Jagielski }
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski 
SetSize(const Size aSize)436*b1cdbd2cSJim Jagielski void PresenterTextView::Implementation::SetSize (const Size aSize)
437*b1cdbd2cSJim Jagielski {
438*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing");
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski     maSize = aSize;
441*b1cdbd2cSJim Jagielski     mpEditEngine->SetPaperSize(maSize);
442*b1cdbd2cSJim Jagielski     mnTotalHeight = -1;
443*b1cdbd2cSJim Jagielski     mxBitmap = NULL;
444*b1cdbd2cSJim Jagielski }
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 
SetBackgroundColor(const Color aColor)449*b1cdbd2cSJim Jagielski void PresenterTextView::Implementation::SetBackgroundColor (const Color aColor)
450*b1cdbd2cSJim Jagielski {
451*b1cdbd2cSJim Jagielski     maBackgroundColor = aColor;
452*b1cdbd2cSJim Jagielski     mxBitmap = NULL;
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing");
455*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngineItemPool!=NULL, "EditEngineItemPool missing");
456*b1cdbd2cSJim Jagielski     mpEditEngine->SetBackgroundColor(aColor);
457*b1cdbd2cSJim Jagielski     mpEditEngine->EnableAutoColor(sal_False);
458*b1cdbd2cSJim Jagielski     mpEditEngine->ForceAutoColor(sal_False);
459*b1cdbd2cSJim Jagielski }
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski 
SetTextColor(const Color aColor)464*b1cdbd2cSJim Jagielski void PresenterTextView::Implementation::SetTextColor (const Color aColor)
465*b1cdbd2cSJim Jagielski {
466*b1cdbd2cSJim Jagielski     maTextColor = aColor;
467*b1cdbd2cSJim Jagielski     mxBitmap = NULL;
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngineItemPool!=NULL, "EditEngineItemPool missing");
470*b1cdbd2cSJim Jagielski     mpEditEngineItemPool->SetPoolDefaultItem(SvxColorItem(aColor, EE_CHAR_COLOR));
471*b1cdbd2cSJim Jagielski }
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski 
SetFontDescriptor(const awt::FontDescriptor & rFontDescriptor)476*b1cdbd2cSJim Jagielski void PresenterTextView::Implementation::SetFontDescriptor (
477*b1cdbd2cSJim Jagielski     const awt::FontDescriptor& rFontDescriptor)
478*b1cdbd2cSJim Jagielski {
479*b1cdbd2cSJim Jagielski     mxBitmap = NULL;
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngineItemPool!=NULL, "EditEngineItemPool missing");
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski     const sal_Int32 nFontHeight = rFontDescriptor.Height;
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski     SvxFontHeightItem aFontHeight(
486*b1cdbd2cSJim Jagielski         Application::GetDefaultDevice()->LogicToPixel(
487*b1cdbd2cSJim Jagielski             Size(0, nFontHeight), MapMode (MAP_POINT)).Height(),
488*b1cdbd2cSJim Jagielski         100,
489*b1cdbd2cSJim Jagielski         EE_CHAR_FONTHEIGHT);
490*b1cdbd2cSJim Jagielski     mpEditEngineItemPool->SetPoolDefaultItem( aFontHeight);
491*b1cdbd2cSJim Jagielski     aFontHeight.SetWhich (EE_CHAR_FONTHEIGHT_CJK);
492*b1cdbd2cSJim Jagielski     mpEditEngineItemPool->SetPoolDefaultItem( aFontHeight);
493*b1cdbd2cSJim Jagielski     aFontHeight.SetWhich (EE_CHAR_FONTHEIGHT_CTL);
494*b1cdbd2cSJim Jagielski     mpEditEngineItemPool->SetPoolDefaultItem( aFontHeight);
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski     SvxFontItem aSvxFontItem (EE_CHAR_FONTINFO);
497*b1cdbd2cSJim Jagielski     aSvxFontItem.SetFamilyName( rFontDescriptor.Name );
498*b1cdbd2cSJim Jagielski     mpEditEngineItemPool->SetPoolDefaultItem(aSvxFontItem);
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski     mnTotalHeight = -1;
501*b1cdbd2cSJim Jagielski     mxBitmap = NULL;
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski     CheckTop();
504*b1cdbd2cSJim Jagielski     mnTotalHeight = -1;
505*b1cdbd2cSJim Jagielski }
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski 
GetTop(void) const510*b1cdbd2cSJim Jagielski sal_Int32 PresenterTextView::Implementation::GetTop (void) const
511*b1cdbd2cSJim Jagielski {
512*b1cdbd2cSJim Jagielski     return mnTop;
513*b1cdbd2cSJim Jagielski }
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski 
SetTop(const sal_Int32 nTop)518*b1cdbd2cSJim Jagielski void PresenterTextView::Implementation::SetTop (const sal_Int32 nTop)
519*b1cdbd2cSJim Jagielski {
520*b1cdbd2cSJim Jagielski     if (nTop == mnTop)
521*b1cdbd2cSJim Jagielski         return;
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski     mnTop = nTop;
524*b1cdbd2cSJim Jagielski     mxBitmap = NULL;
525*b1cdbd2cSJim Jagielski     CheckTop();
526*b1cdbd2cSJim Jagielski }
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski 
SetText(const OUString & rText)531*b1cdbd2cSJim Jagielski void PresenterTextView::Implementation::SetText (const OUString& rText)
532*b1cdbd2cSJim Jagielski {
533*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing");
534*b1cdbd2cSJim Jagielski     msText = rText;
535*b1cdbd2cSJim Jagielski     mpEditEngine->SetPaperSize(maSize);
536*b1cdbd2cSJim Jagielski     mnTotalHeight = -1;
537*b1cdbd2cSJim Jagielski     mxBitmap = NULL;
538*b1cdbd2cSJim Jagielski }
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski 
ParseDistance(const OUString & rsDistance) const543*b1cdbd2cSJim Jagielski sal_Int32 PresenterTextView::Implementation::ParseDistance (const OUString& rsDistance) const
544*b1cdbd2cSJim Jagielski {
545*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing");
546*b1cdbd2cSJim Jagielski     sal_Int32 nDistance (0);
547*b1cdbd2cSJim Jagielski     if (rsDistance.endsWithAsciiL("px", 2))
548*b1cdbd2cSJim Jagielski     {
549*b1cdbd2cSJim Jagielski         nDistance = rsDistance.copy(0,rsDistance.getLength()-2).toInt32();
550*b1cdbd2cSJim Jagielski     }
551*b1cdbd2cSJim Jagielski     else if (rsDistance.endsWithAsciiL("l", 1))
552*b1cdbd2cSJim Jagielski     {
553*b1cdbd2cSJim Jagielski         const sal_Int32 nLines (rsDistance.copy(0,rsDistance.getLength()-1).toInt32());
554*b1cdbd2cSJim Jagielski         // Take the height of the first line as the height of every line.
555*b1cdbd2cSJim Jagielski         const sal_uInt32 nFirstLineHeight (mpEditEngine->GetLineHeight(0,0));
556*b1cdbd2cSJim Jagielski         nDistance = nFirstLineHeight * nLines;
557*b1cdbd2cSJim Jagielski     }
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski     return nDistance;
560*b1cdbd2cSJim Jagielski }
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski 
GetBitmap(void)565*b1cdbd2cSJim Jagielski Reference<rendering::XBitmap> PresenterTextView::Implementation::GetBitmap (void)
566*b1cdbd2cSJim Jagielski {
567*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing");
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski     if ( ! mxBitmap.is())
570*b1cdbd2cSJim Jagielski     {
571*b1cdbd2cSJim Jagielski         if (mpOutputDevice != NULL)
572*b1cdbd2cSJim Jagielski             delete mpOutputDevice;
573*b1cdbd2cSJim Jagielski         mpOutputDevice = new VirtualDevice(*Application::GetDefaultDevice(), 0, 0);
574*b1cdbd2cSJim Jagielski         mpOutputDevice->SetMapMode(MAP_PIXEL);
575*b1cdbd2cSJim Jagielski         mpOutputDevice->SetOutputSizePixel(maSize, sal_True);
576*b1cdbd2cSJim Jagielski         mpOutputDevice->SetLineColor();
577*b1cdbd2cSJim Jagielski         mpOutputDevice->SetFillColor();
578*b1cdbd2cSJim Jagielski         mpOutputDevice->SetBackground(Wallpaper());
579*b1cdbd2cSJim Jagielski         mpOutputDevice->Erase();
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski         MapMode aMapMode (mpOutputDevice->GetMapMode());
582*b1cdbd2cSJim Jagielski         aMapMode.SetOrigin(Point(0,0));
583*b1cdbd2cSJim Jagielski         mpOutputDevice->SetMapMode(aMapMode);
584*b1cdbd2cSJim Jagielski         const Rectangle aWindowBox (Point(0,0), maSize);
585*b1cdbd2cSJim Jagielski         mpOutputDevice->DrawRect(aWindowBox);
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski         mpEditEngine->Clear();
588*b1cdbd2cSJim Jagielski         mpEditEngine->SetText(msText);
589*b1cdbd2cSJim Jagielski         mpEditEngine->SetPaperSize(maSize);
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski         mpEditEngine->Draw(mpOutputDevice, aWindowBox, Point(0,mnTop));
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski         const BitmapEx aBitmap (mpOutputDevice->GetBitmapEx(Point(0,0), maSize));
594*b1cdbd2cSJim Jagielski         mxBitmap = cppcanvas::VCLFactory::getInstance().createBitmap(
595*b1cdbd2cSJim Jagielski             mpCanvas,
596*b1cdbd2cSJim Jagielski             aBitmap
597*b1cdbd2cSJim Jagielski             )->getUNOBitmap();
598*b1cdbd2cSJim Jagielski     }
599*b1cdbd2cSJim Jagielski     return mxBitmap;
600*b1cdbd2cSJim Jagielski }
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski 
GetTotalHeight(void)605*b1cdbd2cSJim Jagielski sal_Int32 PresenterTextView::Implementation::GetTotalHeight (void)
606*b1cdbd2cSJim Jagielski {
607*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing");
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski     if (mnTotalHeight < 0)
610*b1cdbd2cSJim Jagielski     {
611*b1cdbd2cSJim Jagielski         if ( ! mxBitmap.is())
612*b1cdbd2cSJim Jagielski             GetBitmap();
613*b1cdbd2cSJim Jagielski         mnTotalHeight = mpEditEngine->GetTextHeight();
614*b1cdbd2cSJim Jagielski     }
615*b1cdbd2cSJim Jagielski     return mnTotalHeight;
616*b1cdbd2cSJim Jagielski }
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 
CheckTop(void)621*b1cdbd2cSJim Jagielski void PresenterTextView::Implementation::CheckTop (void)
622*b1cdbd2cSJim Jagielski {
623*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing");
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski     if (mnTotalHeight < 0)
626*b1cdbd2cSJim Jagielski         mnTotalHeight = mpEditEngine->GetTextHeight();
627*b1cdbd2cSJim Jagielski     if (mpEditEngine!=NULL && mnTop >= mnTotalHeight)
628*b1cdbd2cSJim Jagielski         mnTop = mnTotalHeight - mpEditEngine->GetLineHeight(0,0);
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski     if (mnTotalHeight < maSize.Height())
631*b1cdbd2cSJim Jagielski         mnTop = 0;
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski     if (mnTotalHeight - mnTop < maSize.Height())
634*b1cdbd2cSJim Jagielski         mnTop = mnTotalHeight - maSize.Height();
635*b1cdbd2cSJim Jagielski 
636*b1cdbd2cSJim Jagielski     if (mnTop < 0)
637*b1cdbd2cSJim Jagielski         mnTop = 0;
638*b1cdbd2cSJim Jagielski }
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski } } // end of namespace ::sd::presenter
642