xref: /trunk/main/sd/source/ui/view/sdview.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
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 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
27 #include <com/sun/star/linguistic2/XSpellChecker1.hpp>
28 
29 #include "View.hxx"
30 #include <editeng/unolingu.hxx>
31 #include <sfx2/request.hxx>
32 #include <svx/obj3d.hxx>
33 #include <svx/fmview.hxx>
34 #include <editeng/outliner.hxx>
35 #ifndef _SVX_SVXIDS_HRC
36 #include <svx/svxids.hrc>
37 #endif
38 #include <svx/svdograf.hxx>
39 #include <svx/svdoole2.hxx>
40 #include <svx/svdundo.hxx>
41 #include <vcl/msgbox.hxx>
42 #include <sfx2/dispatch.hxx>
43 #include <sfx2/app.hxx>
44 #include <svx/svdpagv.hxx>
45 #include <sfx2/docfile.hxx>
46 #include <svx/svdoutl.hxx>
47 #include <svx/sdr/contact/displayinfo.hxx>
48 
49 #include <svx/svdetc.hxx>
50 #include <editeng/editstat.hxx>
51 
52 #include <svx/dialogs.hrc>
53 #include <sfx2/viewfrm.hxx>
54 #include <svx/svdopage.hxx>
55 #include <toolkit/helper/vclunohelper.hxx>
56 #include <svx/xlndsit.hxx>
57 #include <svx/xlineit0.hxx>
58 #include <svx/xlnclit.hxx>
59 #include <svx/sidebar/ContextChangeEventMultiplexer.hxx>
60 #include <vcl/virdev.hxx>
61 
62 #include "app.hrc"
63 #include "strings.hrc"
64 #include "Window.hxx"
65 #include "Client.hxx"
66 #include "drawdoc.hxx"
67 #include "DrawDocShell.hxx"
68 #include "app.hxx"
69 #include "sdpage.hxx"
70 #include "glob.hrc"
71 #include "sdresid.hxx"
72 #include "DrawViewShell.hxx"
73 #include "futext.hxx"
74 #include "fuinsfil.hxx"
75 #include "slideshow.hxx"
76 #include "stlpool.hxx"
77 #include "FrameView.hxx"
78 #include "ViewClipboard.hxx"
79 #include "undo/undomanager.hxx"
80 #include <svx/sdr/contact/viewobjectcontact.hxx>
81 #include <svx/sdr/contact/viewcontact.hxx>
82 #include <svx/sdr/contact/displayinfo.hxx>
83 #include "EventMultiplexer.hxx"
84 #include "ViewShellBase.hxx"
85 #include "ViewShellManager.hxx"
86 
87 #include <basegfx/polygon/b2dpolygontools.hxx>
88 #include <basegfx/color/bcolor.hxx>
89 #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
90 #include <drawinglayer/primitive2d/textlayoutdevice.hxx>
91 #include <drawinglayer/primitive2d/groupprimitive2d.hxx>
92 #include <svx/sdr/contact/objectcontact.hxx>
93 #include <basegfx/matrix/b2dhommatrix.hxx>
94 #include <drawinglayer/primitive2d/textprimitive2d.hxx>
95 #include <svx/unoapi.hxx>
96 #include <basegfx/matrix/b2dhommatrixtools.hxx>
97 
98 #include <numeric>
99 
100 using namespace com::sun::star;
101 using namespace com::sun::star::uno;
102 namespace sd {
103 
104 #ifndef SO2_DECL_SVINPLACEOBJECT_DEFINED
105 #define SO2_DECL_SVINPLACEOBJECT_DEFINED
106 SO2_DECL_REF(SvInPlaceObject)
107 #endif
108 
109 TYPEINIT1(View, FmFormView);
110 
111 /*************************************************************************
112 |*
113 |* Ctor
114 |*
115 \************************************************************************/
116 
117 View::View(SdDrawDocument* pDrawDoc, OutputDevice* pOutDev,
118                ViewShell* pViewShell)
119   : FmFormView(pDrawDoc, pOutDev),
120     mpDoc(pDrawDoc),
121     mpDocSh( pDrawDoc->GetDocSh() ),
122     mpViewSh(pViewShell),
123     mpDragSrcMarkList(NULL),
124     mpDropMarkerObj(NULL),
125     mpDropMarker(NULL),
126     mnDragSrcPgNum(SDRPAGE_NOTFOUND),
127     mnAction(DND_ACTION_NONE),
128     mnLockRedrawSmph(0),
129     mpLockedRedraws(NULL),
130     mbIsDropAllowed(sal_True),
131     maSmartTags(*this),
132     mpClipboard (new ViewClipboard (*this))
133 {
134     // #i73602# Use default from the configuration
135     SetBufferedOverlayAllowed(getOptionsDrawinglayer().IsOverlayBuffer_DrawImpress());
136 
137     // #i74769#, #i75172# Use default from the configuration
138     SetBufferedOutputAllowed(getOptionsDrawinglayer().IsPaintBuffer_DrawImpress());
139 
140     EnableExtendedKeyInputDispatcher(sal_False);
141     EnableExtendedMouseEventDispatcher(sal_False);
142     EnableExtendedCommandEventDispatcher(sal_False);
143 
144     SetUseIncompatiblePathCreateInterface(sal_False);
145     SetMarkHdlWhenTextEdit(sal_True);
146     EnableTextEditOnObjectsWithoutTextIfTextTool(sal_True);
147 
148     SetMinMoveDistancePixel(2);
149     SetHitTolerancePixel(2);
150     SetMeasureLayer(String(SdResId(STR_LAYER_MEASURELINES)));
151 
152     // Timer fuer verzoegertes Drop (muss fuer MAC sein)
153     maDropErrorTimer.SetTimeoutHdl( LINK(this, View, DropErrorHdl) );
154     maDropErrorTimer.SetTimeout(50);
155     maDropInsertFileTimer.SetTimeoutHdl( LINK(this, View, DropInsertFileHdl) );
156     maDropInsertFileTimer.SetTimeout(50);
157 }
158 
159 void View::ImplClearDrawDropMarker()
160 {
161     if(mpDropMarker)
162     {
163         delete mpDropMarker;
164         mpDropMarker = 0L;
165     }
166 }
167 
168 /*************************************************************************
169 |*
170 |* Dtor
171 |*
172 \************************************************************************/
173 
174 View::~View()
175 {
176     maSmartTags.Dispose();
177 
178     // release content of selection clipboard, if we own the content
179     UpdateSelectionClipboard( sal_True );
180 
181     maDropErrorTimer.Stop();
182     maDropInsertFileTimer.Stop();
183 
184     ImplClearDrawDropMarker();
185 
186     while(PaintWindowCount())
187     {
188         // Alle angemeldeten OutDevs entfernen
189         DeleteWindowFromPaintView(GetFirstOutputDevice() /*GetWin(0)*/);
190     }
191 
192     // gespeicherte Redraws loeschen
193     if (mpLockedRedraws)
194     {
195         SdViewRedrawRec* pRec = (SdViewRedrawRec*)mpLockedRedraws->First();
196         while (pRec)
197         {
198             delete pRec;
199             pRec = (SdViewRedrawRec*)mpLockedRedraws->Next();
200         }
201         delete mpLockedRedraws;
202     }
203 }
204 
205 
206 class ViewRedirector : public ::sdr::contact::ViewObjectContactRedirector
207 {
208 public:
209     ViewRedirector();
210     virtual ~ViewRedirector();
211 
212     // all default implementations just call the same methods at the original. To do something
213     // different, overload the method and at least do what the method does.
214     virtual drawinglayer::primitive2d::Primitive2DSequence createRedirectedPrimitive2DSequence(
215         const sdr::contact::ViewObjectContact& rOriginal,
216         const sdr::contact::DisplayInfo& rDisplayInfo);
217 };
218 
219 ViewRedirector::ViewRedirector()
220 {
221 }
222 
223 ViewRedirector::~ViewRedirector()
224 {
225 }
226 
227 drawinglayer::primitive2d::Primitive2DSequence ViewRedirector::createRedirectedPrimitive2DSequence(
228     const sdr::contact::ViewObjectContact& rOriginal,
229     const sdr::contact::DisplayInfo& rDisplayInfo)
230 {
231     SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
232     drawinglayer::primitive2d::Primitive2DSequence xRetval;
233 
234     if(pObject && pObject->GetPage())
235     {
236         const bool bDoCreateGeometry(pObject->GetPage()->checkVisibility( rOriginal, rDisplayInfo, true ));
237 
238         if(!bDoCreateGeometry && !(( pObject->GetObjInventor() == SdrInventor ) && ( pObject->GetObjIdentifier() == OBJ_PAGE )) )
239             return xRetval;
240 
241         PresObjKind eKind(PRESOBJ_NONE);
242         const bool bSubContentProcessing(rDisplayInfo.GetSubContentActive());
243         const bool bIsMasterPageObject(pObject->GetPage()->IsMasterPage());
244         const bool bIsPrinting(rOriginal.GetObjectContact().isOutputToPrinter());
245         const SdrPageView* pPageView = rOriginal.GetObjectContact().TryToGetSdrPageView();
246         const SdrPage* pVisualizedPage = GetSdrPageFromXDrawPage(rOriginal.GetObjectContact().getViewInformation2D().getVisualizedPage());
247         const SdPage* pObjectsSdPage = dynamic_cast< SdPage* >(pObject->GetPage());
248         const bool bIsInsidePageObj(pPageView && pPageView->GetPage() != pVisualizedPage);
249 
250         // check if we need to draw a placeholder border. Never do it for
251         // objects inside a SdrPageObj and never when printing
252         if(!bIsInsidePageObj && !bIsPrinting)
253         {
254             bool bCreateOutline(false);
255 
256             if( pObject->IsEmptyPresObj() && pObject->ISA(SdrTextObj) )
257             {
258                 if( !bSubContentProcessing || !pObject->IsNotVisibleAsMaster() )
259                 {
260                     eKind = pObjectsSdPage ? pObjectsSdPage->GetPresObjKind(pObject) : PRESOBJ_NONE;
261                     bCreateOutline = true;
262                 }
263             }
264             else if( ( pObject->GetObjInventor() == SdrInventor ) && ( pObject->GetObjIdentifier() == OBJ_TEXT ) )
265             {
266                 if( pObjectsSdPage )
267                 {
268                     eKind = pObjectsSdPage->GetPresObjKind(pObject);
269 
270                     if((eKind == PRESOBJ_FOOTER) || (eKind == PRESOBJ_HEADER) || (eKind == PRESOBJ_DATETIME) || (eKind == PRESOBJ_SLIDENUMBER) )
271                     {
272                         if( !bSubContentProcessing )
273                         {
274                             // only draw a boundary for header&footer objects on the masterpage itself
275                             bCreateOutline = true;
276                         }
277                     }
278                 }
279             }
280             else if( ( pObject->GetObjInventor() == SdrInventor ) && ( pObject->GetObjIdentifier() == OBJ_PAGE ) )
281             {
282                 // only for handout page, else this frame will be created for each
283                 // page preview object in SlideSorter and PagePane
284                 if(pObjectsSdPage && PK_HANDOUT == pObjectsSdPage->GetPageKind())
285                 {
286                     bCreateOutline = true;
287                 }
288             }
289 
290             if(bCreateOutline)
291             {
292                 // empty presentation objects get a gray frame
293                 const svtools::ColorConfig aColorConfig;
294                 const svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( svtools::OBJECTBOUNDARIES ) );
295 
296                 if( aColor.bIsVisible )
297                 {
298                     // get basic object transformation
299                     const basegfx::BColor aRGBColor(Color(aColor.nColor).getBColor());
300                     basegfx::B2DHomMatrix aObjectMatrix;
301                     basegfx::B2DPolyPolygon aObjectPolyPolygon;
302                     pObject->TRGetBaseGeometry(aObjectMatrix, aObjectPolyPolygon);
303 
304                     // create dashed border
305                     {
306                         // create object polygon
307                         basegfx::B2DPolygon aPolygon(basegfx::tools::createUnitPolygon());
308                         aPolygon.transform(aObjectMatrix);
309 
310                         // create line and stroke attribute
311                         ::std::vector< double > aDotDashArray;
312 
313                         aDotDashArray.push_back(160.0);
314                         aDotDashArray.push_back(80.0);
315 
316                         const double fFullDotDashLen(::std::accumulate(aDotDashArray.begin(), aDotDashArray.end(), 0.0));
317                         const drawinglayer::attribute::LineAttribute aLine(aRGBColor);
318                         const drawinglayer::attribute::StrokeAttribute aStroke(aDotDashArray, fFullDotDashLen);
319 
320                         // create primitive and add
321                         const drawinglayer::primitive2d::Primitive2DReference xRef(new drawinglayer::primitive2d::PolygonStrokePrimitive2D(
322                             aPolygon,
323                             aLine,
324                             aStroke));
325                         drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(xRetval, xRef);
326                     }
327 
328                     // now paint the placeholder description, but only when masterpage
329                     // is displayed as page directly (MasterPage view)
330                     if(!bSubContentProcessing && bIsMasterPageObject)
331                     {
332                         String aObjectString;
333 
334                         switch( eKind )
335                         {
336                             case PRESOBJ_TITLE:
337                             {
338                                 if(pObjectsSdPage && pObjectsSdPage->GetPageKind() == PK_STANDARD)
339                                 {
340                                     static String aTitleAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_TITLE ) );
341                                     aObjectString = aTitleAreaStr;
342                                 }
343 
344                                 break;
345                             }
346                             case PRESOBJ_OUTLINE:
347                             {
348                                 static String aOutlineAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_OUTLINE ) );
349                                 aObjectString = aOutlineAreaStr;
350                                 break;
351                             }
352                             case PRESOBJ_FOOTER:
353                             {
354                                 static String aFooterAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_FOOTER ) );
355                                 aObjectString = aFooterAreaStr;
356                                 break;
357                             }
358                             case PRESOBJ_HEADER:
359                             {
360                                 static String aHeaderAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_HEADER ) );
361                                 aObjectString = aHeaderAreaStr;
362                                 break;
363                             }
364                             case PRESOBJ_DATETIME:
365                             {
366                                 static String aDateTimeStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_DATETIME ) );
367                                 aObjectString = aDateTimeStr;
368                                 break;
369                             }
370                             case PRESOBJ_NOTES:
371                             {
372                                 static String aDateTimeStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_NOTES ) );
373                                 aObjectString = aDateTimeStr;
374                                 break;
375                             }
376                             case PRESOBJ_SLIDENUMBER:
377                             {
378                                 if(pObjectsSdPage && pObjectsSdPage->GetPageKind() == PK_STANDARD)
379                                 {
380                                     static String aSlideAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_SLIDE ) );
381                                     aObjectString = aSlideAreaStr;
382                                 }
383                                 else
384                                 {
385                                     static String aNumberAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_NUMBER ) );
386                                     aObjectString = aNumberAreaStr;
387                                 }
388                                 break;
389                             }
390                             default:
391                             {
392                                 break;
393                             }
394                         }
395 
396                         if( aObjectString.Len() )
397                         {
398                             // decompose object matrix to be able to place text correctly
399                             basegfx::B2DTuple aScale;
400                             basegfx::B2DTuple aTranslate;
401                             double fRotate, fShearX;
402                             aObjectMatrix.decompose(aScale, aTranslate, fRotate, fShearX);
403 
404                             // create font
405                             SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObject );
406                             const SdrTextVertAdjust eTVA(pTextObj ? pTextObj->GetTextVerticalAdjust() : SDRTEXTVERTADJUST_CENTER);
407                             Font aScaledVclFont;
408 
409                             // use a text size factor to get more reliable text sizes from the text layouter
410                             // (and from vcl), tipp from HDU
411                             static sal_uInt32 nTextSizeFactor(100);
412 
413                             // use a factor to get more linear text size calculations
414                             aScaledVclFont.SetHeight( 500 * nTextSizeFactor );
415 
416                             // get basic geometry and get text size
417                             drawinglayer::primitive2d::TextLayouterDevice aTextLayouter;
418                             aTextLayouter.setFont(aScaledVclFont);
419                             const xub_StrLen nTextLength(aObjectString.Len());
420 
421                             // do not forget to use the factor again to get the width for the 500
422                             const double fTextWidth(aTextLayouter.getTextWidth(aObjectString, 0, nTextLength) * (1.0 / nTextSizeFactor));
423                             const double fTextHeight(aTextLayouter.getTextHeight() * (1.0 / nTextSizeFactor));
424 
425                             // calculate text primitive position. If text is at bottom, use top for
426                             // the extra text and vice versa
427                             const double fHorDist(125);
428                             const double fVerDist(125);
429                             const double fPosX((aTranslate.getX() + aScale.getX()) - fTextWidth - fHorDist);
430                             const double fPosY((SDRTEXTVERTADJUST_BOTTOM == eTVA)
431                                 ? aTranslate.getY() - fVerDist + fTextHeight
432                                 : (aTranslate.getY() + aScale.getY()) - fVerDist);
433 
434                             // get font attributes; use normally scaled font
435                             const basegfx::BColor aFontColor(aRGBColor);
436                             Font aVclFont;
437                             basegfx::B2DVector aTextSizeAttribute;
438 
439                             aVclFont.SetHeight( 500 );
440 
441                             const drawinglayer::attribute::FontAttribute aFontAttribute(
442                                 drawinglayer::primitive2d::getFontAttributeFromVclFont(
443                                     aTextSizeAttribute,
444                                     aVclFont,
445                                     false,
446                                     false));
447 
448                             // fill text matrix
449                             const basegfx::B2DHomMatrix aTextMatrix(basegfx::tools::createScaleShearXRotateTranslateB2DHomMatrix(
450                                 aTextSizeAttribute.getX(), aTextSizeAttribute.getY(),
451                                 fShearX,
452                                 fRotate,
453                                 fPosX, fPosY));
454 
455                             // create DXTextArray (can be empty one)
456                             const ::std::vector< double > aDXArray;
457 
458                             // create locale; this may need some more information in the future
459                             const ::com::sun::star::lang::Locale aLocale;
460 
461                             // create primitive and add
462                             const drawinglayer::primitive2d::Primitive2DReference xRef(
463                                 new drawinglayer::primitive2d::TextSimplePortionPrimitive2D(
464                                     aTextMatrix,
465                                     aObjectString,
466                                     0,
467                                     nTextLength,
468                                     aDXArray,
469                                     aFontAttribute,
470                                     aLocale,
471                                     aFontColor));
472                             drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(xRetval, xRef);
473                         }
474                     }
475                 }
476             }
477         }
478 
479         if(bDoCreateGeometry)
480         {
481             drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(
482                 xRetval,
483                 sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
484                     rOriginal,
485                     rDisplayInfo));
486         }
487     }
488     else
489     {
490         // not a SdrObject visualisation (maybe e.g. page) or no page
491         xRetval = sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo);
492     }
493 
494     return xRetval;
495 }
496 
497 /*************************************************************************
498 |*
499 |* Paint-Methode: das Ereignis wird an die View weitergeleitet
500 |*
501 \************************************************************************/
502 
503 void View::CompleteRedraw(OutputDevice* pOutDev, const Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector /*=0L*/)
504 {
505     // ausfuehren ??
506     if (mnLockRedrawSmph == 0)
507     {
508         SdrPageView* pPgView = GetSdrPageView();
509 
510         if (pPgView)
511         {
512             SdPage* pPage = (SdPage*) pPgView->GetPage();
513             if( pPage )
514             {
515                 SdrOutliner& rOutl=mpDoc->GetDrawOutliner(NULL);
516                 bool bScreenDisplay(true);
517 
518                 if(bScreenDisplay && pOutDev && OUTDEV_PRINTER == pOutDev->GetOutDevType())
519                 {
520                     // #i75566# printing; suppress AutoColor BackgroundColor generation
521                     // for visibility reasons by giving GetPageBackgroundColor()
522                     // the needed hint
523                     bScreenDisplay = false;
524                 }
525 
526                 if(bScreenDisplay && pOutDev && pOutDev->GetPDFWriter())
527                 {
528                     // #i75566# PDF export; suppress AutoColor BackgroundColor generation (see above)
529                     bScreenDisplay = false;
530                 }
531 
532                 // #i75566# Name change GetBackgroundColor -> GetPageBackgroundColor and
533                 // hint value if screen display. Only then the AutoColor mechanisms shall be applied
534                 rOutl.SetBackgroundColor( pPage->GetPageBackgroundColor(pPgView, bScreenDisplay) );
535             }
536         }
537 
538         ViewRedirector aViewRedirector;
539         FmFormView::CompleteRedraw(pOutDev, rReg, pRedirector ? pRedirector : &aViewRedirector);
540     }
541     // oder speichern?
542     else
543     {
544         if (!mpLockedRedraws)
545             mpLockedRedraws = new List;
546 
547         SdViewRedrawRec* pRec = new SdViewRedrawRec;
548         pRec->mpOut = pOutDev;
549         pRec->aRect = rReg.GetBoundRect();
550         mpLockedRedraws->Insert(pRec, LIST_APPEND);
551     }
552 }
553 
554 
555 /*************************************************************************
556 |*
557 |* Selektion hat sich geaendert
558 |*
559 \************************************************************************/
560 
561 void View::MarkListHasChanged()
562 {
563     FmFormView::MarkListHasChanged();
564 
565     if( GetMarkedObjectCount() > 0 )
566         maSmartTags.deselect();
567 }
568 
569 
570 /*************************************************************************
571 |*
572 |* Attribute setzen
573 |*
574 \************************************************************************/
575 
576 sal_Bool View::SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll)
577 {
578     sal_Bool bOk = FmFormView::SetAttributes(rSet, bReplaceAll);
579     return (bOk);
580 }
581 
582 
583 /*************************************************************************
584 |*
585 |* Attribute holen
586 |*
587 \************************************************************************/
588 
589 sal_Bool View::GetAttributes( SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr ) const
590 {
591     return( FmFormView::GetAttributes( rTargetSet, bOnlyHardAttr ) );
592 }
593 
594 
595 /*************************************************************************
596 |*
597 |* Ist ein Praesentationsobjekt selektiert?
598 |*
599 \************************************************************************/
600 
601 sal_Bool View::IsPresObjSelected(sal_Bool bOnPage, sal_Bool bOnMasterPage, sal_Bool bCheckPresObjListOnly, sal_Bool bCheckLayoutOnly) const
602 {
603     /**************************************************************************
604     * Ist ein Presentationsobjekt selektiert?
605     **************************************************************************/
606     SdrMarkList* pMarkList;
607 
608     if (mnDragSrcPgNum != SDRPAGE_NOTFOUND &&
609         mnDragSrcPgNum != GetSdrPageView()->GetPage()->GetPageNum())
610     {
611         // Es laeuft gerade Drag&Drop
612         // Source- und Destination-Page unterschiedlich:
613         // es wird die gemerkte MarkList verwendet
614         pMarkList = mpDragSrcMarkList;
615     }
616     else
617     {
618         // Es wird die aktuelle MarkList verwendet
619         pMarkList = new SdrMarkList(GetMarkedObjectList());
620     }
621 
622     SdrMark* pMark;
623     SdPage* pPage;
624     SdrObject* pObj;
625 
626     sal_Bool bSelected = sal_False;
627     sal_Bool bMasterPage = sal_False;
628     long nMark;
629     long nMarkMax = long(pMarkList->GetMarkCount()) - 1;
630 
631     for (nMark = nMarkMax; (nMark >= 0) && !bSelected; nMark--)
632     {
633         // Rueckwaerts durch die Marklist
634         pMark = pMarkList->GetMark(nMark);
635         pObj = pMark->GetMarkedSdrObj();
636 
637         if ( pObj && ( bCheckPresObjListOnly || pObj->IsEmptyPresObj() || pObj->GetUserCall() ) )
638         {
639             pPage = (SdPage*) pObj->GetPage();
640             bMasterPage = pPage->IsMasterPage();
641 
642             if ( (bMasterPage && bOnMasterPage) || (!bMasterPage && bOnPage) )
643             {
644                 if ( pPage && pPage->IsPresObj(pObj) )
645                 {
646                     if( bCheckLayoutOnly )
647                     {
648                         PresObjKind eKind = pPage->GetPresObjKind(pObj);
649 
650                         if((eKind != PRESOBJ_FOOTER) && (eKind != PRESOBJ_HEADER) && (eKind != PRESOBJ_DATETIME) && (eKind != PRESOBJ_SLIDENUMBER) )
651                             bSelected = sal_True;
652                     }
653                     else
654                     {
655                         bSelected = sal_True;
656                     }
657                 }
658             }
659         }
660     }
661 
662     if (pMarkList != mpDragSrcMarkList)
663     {
664        delete pMarkList;
665     }
666 
667     return (bSelected);
668 }
669 
670 /*************************************************************************
671 |*
672 |* Alles selektieren
673 |*
674 \************************************************************************/
675 
676 void View::SelectAll()
677 {
678     if ( IsTextEdit() )
679     {
680         OutlinerView* pOLV = GetTextEditOutlinerView();
681         const ::Outliner* pOutliner = GetTextEditOutliner();
682         pOLV->SelectRange( 0, (sal_uInt16) pOutliner->GetParagraphCount() );
683     }
684     else
685     {
686         MarkAll();
687     }
688 }
689 
690 
691 /*************************************************************************
692 |*
693 |* Dokument hat sich geaendert
694 |*
695 \************************************************************************/
696 
697 void View::ModelHasChanged()
698 {
699     // Erst SdrView benachrichtigen
700     FmFormView::ModelHasChanged();
701 }
702 
703 /*************************************************************************
704 |*
705 |* StyleSheet setzen
706 |*
707 \************************************************************************/
708 
709 sal_Bool View::SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr)
710 {
711     // weiter an SdrView
712     return FmFormView::SetStyleSheet(pStyleSheet, bDontRemoveHardAttr);
713 }
714 
715 
716 /*************************************************************************
717 |*
718 |* Texteingabe beginnen
719 |*
720 \************************************************************************/
721 
722 static void SetSpellOptions( SdDrawDocument* pDoc, sal_uLong& rCntrl )
723 {
724     sal_Bool bOnlineSpell = pDoc->GetOnlineSpell();
725 
726     if( bOnlineSpell )
727         rCntrl |= EE_CNTRL_ONLINESPELLING;
728     else
729         rCntrl &= ~EE_CNTRL_ONLINESPELLING;
730 }
731 
732 sal_Bool View::SdrBeginTextEdit(
733     SdrObject* pObj, SdrPageView* pPV, ::Window* pWin,
734     sal_Bool bIsNewObj,
735     SdrOutliner* pOutl, OutlinerView* pGivenOutlinerView,
736     sal_Bool bDontDeleteOutliner, sal_Bool bOnlyOneView, sal_Bool bGrabFocus )
737 {
738     GetViewShell()->GetViewShellBase().GetEventMultiplexer()->MultiplexEvent(
739         sd::tools::EventMultiplexerEvent::EID_BEGIN_TEXT_EDIT, (void*)pObj );
740 
741     if( pOutl==NULL && pObj )
742         pOutl = SdrMakeOutliner( OUTLINERMODE_TEXTOBJECT, pObj->GetModel() );
743 
744     // make draw&impress specific initialisations
745     if( pOutl )
746     {
747         pOutl->SetStyleSheetPool((SfxStyleSheetPool*) mpDoc->GetStyleSheetPool());
748         pOutl->SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl));
749         sal_uLong nCntrl = pOutl->GetControlWord();
750         nCntrl |= EE_CNTRL_ALLOWBIGOBJS;
751         nCntrl |= EE_CNTRL_URLSFXEXECUTE;
752         nCntrl |= EE_CNTRL_MARKFIELDS;
753         nCntrl |= EE_CNTRL_AUTOCORRECT;
754 
755         nCntrl &= ~EE_CNTRL_ULSPACESUMMATION;
756         if ( mpDoc->IsSummationOfParagraphs() )
757             nCntrl |= EE_CNTRL_ULSPACESUMMATION;
758 
759         SetSpellOptions( mpDoc, nCntrl );
760 
761         pOutl->SetControlWord(nCntrl);
762 
763         Reference< linguistic2::XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
764         if ( xSpellChecker.is() )
765             pOutl->SetSpeller( xSpellChecker );
766 
767         Reference< linguistic2::XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
768         if( xHyphenator.is() )
769             pOutl->SetHyphenator( xHyphenator );
770 
771         pOutl->SetDefaultLanguage( Application::GetSettings().GetLanguage() );
772     }
773 
774     sal_Bool bReturn = FmFormView::SdrBeginTextEdit(
775         pObj, pPV, pWin, bIsNewObj, pOutl,
776         pGivenOutlinerView, bDontDeleteOutliner,
777         bOnlyOneView, bGrabFocus);
778 
779     ContextChangeEventMultiplexer::NotifyContextChange(
780         GetViewShell()->GetViewShellBase().GetController(),
781         ::sfx2::sidebar::EnumContext::Context_Text);
782 
783     if (bReturn)
784     {
785         ::Outliner* pOL = GetTextEditOutliner();
786 
787         if( pObj && pObj->GetPage() )
788         {
789             Color aBackground;
790             if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_TABLE )
791             {
792                 aBackground = GetTextEditBackgroundColor(*this);
793             }
794             else
795             {
796                 aBackground = pObj->GetPage()->GetPageBackgroundColor(pPV);
797             }
798             if (pOL != NULL)
799                 pOL->SetBackgroundColor( aBackground  );
800         }
801 
802         if (pOL != NULL)
803         {
804             pOL->SetParaInsertedHdl(LINK(this, View, OnParagraphInsertedHdl));
805             pOL->SetParaRemovingHdl(LINK(this, View, OnParagraphRemovingHdl));
806         }
807     }
808 
809     return(bReturn);
810 }
811 
812 /** ends current text editing */
813 SdrEndTextEditKind View::SdrEndTextEdit(sal_Bool bDontDeleteReally )
814 {
815     SdrObjectWeakRef xObj( GetTextEditObject() );
816 
817     sal_Bool bDefaultTextRestored = RestoreDefaultText( dynamic_cast< SdrTextObj* >( GetTextEditObject() ) );
818 
819     SdrEndTextEditKind eKind = FmFormView::SdrEndTextEdit(bDontDeleteReally);
820 
821     if( bDefaultTextRestored )
822     {
823         if( xObj.is() && !xObj->IsEmptyPresObj() )
824         {
825             xObj->SetEmptyPresObj( sal_True );
826         }
827         else
828         {
829             eKind = SDRENDTEXTEDIT_UNCHANGED;
830         }
831     }
832     else if( xObj.is() && xObj->IsEmptyPresObj() )
833     {
834         SdrTextObj* pObj = dynamic_cast< SdrTextObj* >( xObj.get() );
835         if( pObj && pObj->HasText() )
836         {
837             SdrPage* pPage = pObj->GetPage();
838             if( !pPage || !pPage->IsMasterPage() )
839                 pObj->SetEmptyPresObj( sal_False );
840         }
841     }
842 
843     GetViewShell()->GetViewShellBase().GetEventMultiplexer()->MultiplexEvent(
844         sd::tools::EventMultiplexerEvent::EID_END_TEXT_EDIT,
845         (void*)xObj.get() );
846     ContextChangeEventMultiplexer::NotifyContextChange(
847         GetViewShell()->GetViewShellBase().GetController(),
848         ::sfx2::sidebar::EnumContext::Context_Default);
849 
850     if( xObj.is() )
851     {
852         SdPage* pPage = dynamic_cast< SdPage* >( xObj->GetPage() );
853         if( pPage )
854             pPage->onEndTextEdit( xObj.get() );
855     }
856 
857     return(eKind);
858 }
859 
860 // --------------------------------------------------------------------
861 
862 /** restores the default text if the given text object is currently in edit mode and
863     no text has been entered already. Is only usefull just before text edit ends. */
864 bool View::RestoreDefaultText( SdrTextObj* pTextObj )
865 {
866     bool bRestored = false;
867 
868     if( pTextObj && (pTextObj == GetTextEditObject()) )
869     {
870         if( !pTextObj->HasText() )
871         {
872             SdPage* pPage = dynamic_cast< SdPage* >( pTextObj->GetPage() );
873 
874             if(pPage)
875             {
876                 bRestored = pPage->RestoreDefaultText( pTextObj );
877                 if( bRestored )
878                 {
879                     SdrOutliner* pOutliner = GetTextEditOutliner();
880                     pTextObj->SetTextEditOutliner( pOutliner );
881                     OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject();
882                     if (pOutliner)
883                         pOutliner->SetText(*pParaObj);
884                 }
885             }
886         }
887     }
888 
889     return bRestored;
890 }
891 
892 /*************************************************************************
893 |*
894 |* Originalgroesse der markierten Objekte setzen
895 |*
896 \************************************************************************/
897 
898 void View::SetMarkedOriginalSize()
899 {
900     SdrUndoGroup*   pUndoGroup = new SdrUndoGroup(*mpDoc);
901     sal_uLong           nCount = GetMarkedObjectCount();
902     sal_Bool            bOK = sal_False;
903 
904     for( sal_uInt32 i = 0; i < nCount; i++ )
905     {
906         SdrObject* pObj = GetMarkedObjectByIndex(i);
907 
908         if( pObj->GetObjInventor() == SdrInventor )
909         {
910             if( pObj->GetObjIdentifier() == OBJ_OLE2 )
911             {
912                 uno::Reference < embed::XEmbeddedObject > xObj = ((SdrOle2Obj*)pObj)->GetObjRef();
913                 if( xObj.is() )
914                 {
915                     // TODO/LEAN: working with VisualArea can switch object to running state
916 
917                     sal_Int64 nAspect = ((SdrOle2Obj*)pObj)->GetAspect();
918                     Size aOleSize;
919 
920                     if ( nAspect == embed::Aspects::MSOLE_ICON )
921                     {
922                         MapMode aMap100( MAP_100TH_MM );
923                         aOleSize = ((SdrOle2Obj*)pObj)->GetOrigObjSize( &aMap100 );
924                         bOK = sal_True;
925                     }
926                     else
927                     {
928                         MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
929                         try
930                         {
931                             awt::Size aSz = xObj->getVisualAreaSize( nAspect );
932                             aOleSize = OutputDevice::LogicToLogic( Size( aSz.Width, aSz.Height ), aUnit, MAP_100TH_MM );
933                             bOK = sal_True;
934                         }
935                         catch( embed::NoVisualAreaSizeException& )
936                         {}
937                     }
938 
939                     if ( bOK )
940                     {
941                         Rectangle   aDrawRect( pObj->GetLogicRect() );
942 
943                         pUndoGroup->AddAction( mpDoc->GetSdrUndoFactory().CreateUndoGeoObject( *pObj ) );
944                         pObj->Resize( aDrawRect.TopLeft(), Fraction( aOleSize.Width(), aDrawRect.GetWidth() ),
945                                                         Fraction( aOleSize.Height(), aDrawRect.GetHeight() ) );
946                     }
947                 }
948             }
949             else if( pObj->GetObjIdentifier() == OBJ_GRAF )
950             {
951                 const MapMode   aMap100( MAP_100TH_MM );
952                 Size            aSize;
953 
954                 if ( static_cast< SdrGrafObj* >( pObj )->GetGrafPrefMapMode().GetMapUnit() == MAP_PIXEL )
955                     aSize = Application::GetDefaultDevice()->PixelToLogic( static_cast< SdrGrafObj* >( pObj )->GetGrafPrefSize(), aMap100 );
956                 else
957                 {
958                     aSize = OutputDevice::LogicToLogic( static_cast< SdrGrafObj* >( pObj )->GetGrafPrefSize(),
959                                                         static_cast< SdrGrafObj* >( pObj )->GetGrafPrefMapMode(),
960                                                         aMap100 );
961                 }
962 
963                 pUndoGroup->AddAction( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj ) );
964                 Rectangle aRect( pObj->GetLogicRect() );
965                 aRect.SetSize( aSize );
966                 pObj->SetLogicRect( aRect );
967 
968                 bOK = sal_True;
969             }
970         }
971     }
972 
973     if( bOK )
974     {
975         pUndoGroup->SetComment( String(SdResId(STR_UNDO_ORIGINALSIZE)) );
976         mpDocSh->GetUndoManager()->AddUndoAction(pUndoGroup);
977     }
978     else
979         delete pUndoGroup;
980 }
981 
982 /*************************************************************************
983 |*
984 |* OLE-Obj am Client connecten
985 |*
986 \************************************************************************/
987 
988 void View::DoConnect(SdrOle2Obj* pObj)
989 {
990     if (mpViewSh)
991     {
992         uno::Reference < embed::XEmbeddedObject > xObj( pObj->GetObjRef() );
993         if( xObj.is() )
994         {
995             ::sd::Window* pWindow = mpViewSh->GetActiveWindow();
996             SfxInPlaceClient* pSdClient = mpViewSh-> GetViewShellBase().FindIPClient( xObj, pWindow );
997             if ( !pSdClient )
998             {
999                 pSdClient = new Client(pObj, mpViewSh, pWindow);
1000                 Rectangle aRect = pObj->GetLogicRect();
1001                 {
1002                     // TODO/LEAN: working with visual area can switch object to running state
1003                     Size aDrawSize = aRect.GetSize();
1004                     awt::Size aSz;
1005 
1006                     MapMode aMapMode( mpDoc->GetScaleUnit() );
1007                     Size aObjAreaSize = pObj->GetOrigObjSize( &aMapMode );
1008 
1009                     Fraction aScaleWidth (aDrawSize.Width(),  aObjAreaSize.Width() );
1010                     Fraction aScaleHeight(aDrawSize.Height(), aObjAreaSize.Height() );
1011                     aScaleWidth.ReduceInaccurate(10);       // kompatibel zum SdrOle2Obj
1012                     aScaleHeight.ReduceInaccurate(10);
1013                     pSdClient->SetSizeScale(aScaleWidth, aScaleHeight);
1014 
1015                     // sichtbarer Ausschnitt wird nur inplace veraendert!
1016                     // the object area must be set after the scaling, since it triggers resize
1017                     aRect.SetSize(aObjAreaSize);
1018                     pSdClient->SetObjArea(aRect);
1019                 }
1020             }
1021         }
1022     }
1023 }
1024 
1025 /*************************************************************************
1026 |*
1027 |*
1028 |*
1029 \************************************************************************/
1030 
1031 sal_Bool View::IsMorphingAllowed() const
1032 {
1033     const SdrMarkList&  rMarkList = GetMarkedObjectList();
1034     sal_Bool                bRet = sal_False;
1035 
1036     if ( rMarkList.GetMarkCount() == 2 )
1037     {
1038         const SdrObject*    pObj1 = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
1039         const SdrObject*    pObj2 = rMarkList.GetMark( 1 )->GetMarkedSdrObj();
1040         const sal_uInt16        nKind1 = pObj1->GetObjIdentifier();
1041         const sal_uInt16        nKind2 = pObj2->GetObjIdentifier();
1042 
1043         if ( ( nKind1 != OBJ_TEXT && nKind2 != OBJ_TEXT ) &&
1044              ( nKind1 != OBJ_TITLETEXT && nKind2 != OBJ_TITLETEXT ) &&
1045              ( nKind1 != OBJ_OUTLINETEXT && nKind2 != OBJ_OUTLINETEXT ) &&
1046              ( nKind1 != OBJ_GRUP && nKind2 != OBJ_GRUP ) &&
1047              ( nKind1 != OBJ_LINE && nKind2 != OBJ_LINE ) &&
1048              ( nKind1 != OBJ_PLIN && nKind2 != OBJ_PLIN ) &&
1049              ( nKind1 != OBJ_PATHLINE && nKind2 != OBJ_PATHLINE ) &&
1050              ( nKind1 != OBJ_FREELINE && nKind2 != OBJ_FREELINE ) &&
1051              ( nKind1 != OBJ_PATHPLIN && nKind2 != OBJ_PATHPLIN ) &&
1052              ( nKind1 != OBJ_MEASURE && nKind2 != OBJ_MEASURE ) &&
1053              ( nKind1 != OBJ_EDGE && nKind2 != OBJ_EDGE ) &&
1054              ( nKind1 != OBJ_GRAF && nKind2 != OBJ_GRAF ) &&
1055              ( nKind1 != OBJ_OLE2 && nKind2 != OBJ_OLE2 ) &&
1056              ( nKind1 != OBJ_CAPTION && nKind2 !=  OBJ_CAPTION ) &&
1057              !pObj1->ISA( E3dObject) && !pObj2->ISA( E3dObject) )
1058         {
1059             SfxItemSet      aSet1( mpDoc->GetPool(), XATTR_FILLSTYLE, XATTR_FILLSTYLE );
1060             SfxItemSet      aSet2( mpDoc->GetPool(), XATTR_FILLSTYLE, XATTR_FILLSTYLE );
1061 
1062             aSet1.Put(pObj1->GetMergedItemSet());
1063             aSet2.Put(pObj2->GetMergedItemSet());
1064 
1065             const XFillStyle    eFillStyle1 = ( (const XFillStyleItem&) aSet1.Get( XATTR_FILLSTYLE ) ).GetValue();
1066             const XFillStyle    eFillStyle2 = ( (const XFillStyleItem&) aSet2.Get( XATTR_FILLSTYLE ) ).GetValue();
1067 
1068             if( ( eFillStyle1 == XFILL_NONE || eFillStyle1 == XFILL_SOLID ) &&
1069                 ( eFillStyle2 == XFILL_NONE || eFillStyle2 == XFILL_SOLID ) )
1070                 bRet = sal_True;
1071         }
1072     }
1073 
1074     return bRet;
1075 }
1076 
1077 /*************************************************************************
1078 |*
1079 |*
1080 |*
1081 \************************************************************************/
1082 
1083 sal_Bool View::IsVectorizeAllowed() const
1084 {
1085     const SdrMarkList&  rMarkList = GetMarkedObjectList();
1086     sal_Bool                bRet = sal_False;
1087 
1088     if( rMarkList.GetMarkCount() == 1 )
1089     {
1090         const SdrGrafObj* pObj = dynamic_cast< const SdrGrafObj* >(rMarkList.GetMark( 0 )->GetMarkedSdrObj());
1091 
1092         if(pObj)
1093         {
1094             if(GRAPHIC_BITMAP == pObj->GetGraphicType() && !pObj->isEmbeddedSvg())
1095             {
1096                 bRet = sal_True;
1097             }
1098         }
1099     }
1100 
1101     return bRet;
1102 }
1103 
1104 void View::onAccessibilityOptionsChanged()
1105 {
1106     if( mpViewSh )
1107     {
1108         ::sd::Window* pWindow = mpViewSh->GetActiveWindow();
1109         if( pWindow )
1110         {
1111             const StyleSettings& rStyleSettings = pWindow->GetSettings().GetStyleSettings();
1112 
1113             sal_uInt16 nOutputSlot, nPreviewSlot;
1114 
1115             SvtAccessibilityOptions& aAccOptions = getAccessibilityOptions();
1116 
1117             if( mpViewSh->GetViewFrame() && mpViewSh->GetViewFrame()->GetDispatcher() )
1118             {
1119                 if( rStyleSettings.GetHighContrastMode() )
1120                 {
1121                     nOutputSlot = SID_OUTPUT_QUALITY_CONTRAST;
1122                 }
1123                 else
1124                 {
1125                     nOutputSlot = SID_OUTPUT_QUALITY_COLOR;
1126                 }
1127 
1128                 if( rStyleSettings.GetHighContrastMode() && aAccOptions.GetIsForPagePreviews() )
1129                 {
1130                     nPreviewSlot = SID_PREVIEW_QUALITY_CONTRAST;
1131                 }
1132                 else
1133                 {
1134                     nPreviewSlot = SID_PREVIEW_QUALITY_COLOR;
1135                 }
1136 
1137                 mpViewSh->GetViewFrame()->GetDispatcher()->Execute( nOutputSlot, SFX_CALLMODE_ASYNCHRON );
1138                 mpViewSh->GetViewFrame()->GetDispatcher()->Execute( nPreviewSlot, SFX_CALLMODE_ASYNCHRON );
1139             }
1140 
1141             mpViewSh->Invalidate();
1142         }
1143     }
1144 }
1145 
1146 IMPL_LINK( View, OnParagraphInsertedHdl, ::Outliner *, pOutliner )
1147 {
1148     Paragraph* pPara = pOutliner->GetHdlParagraph();
1149     SdrObject* pObj = GetTextEditObject();
1150 
1151     if( pPara && pObj )
1152     {
1153         SdPage* pPage = dynamic_cast< SdPage* >( pObj->GetPage() );
1154         if( pPage )
1155             pPage->onParagraphInserted( pOutliner, pPara, pObj );
1156     }
1157     return 0;
1158 }
1159 
1160 /*************************************************************************
1161 |*
1162 |* Handler fuer das Loeschen von Seiten (Absaetzen)
1163 |*
1164 \************************************************************************/
1165 
1166 IMPL_LINK( View, OnParagraphRemovingHdl, ::Outliner *, pOutliner )
1167 {
1168     Paragraph* pPara = pOutliner->GetHdlParagraph();
1169     SdrObject* pObj = GetTextEditObject();
1170 
1171     if( pPara && pObj )
1172     {
1173         SdPage* pPage = dynamic_cast< SdPage* >( pObj->GetPage() );
1174         if( pPage )
1175             pPage->onParagraphRemoving( pOutliner, pPara, pObj );
1176     }
1177     return 0;
1178 }
1179 
1180 bool View::isRecordingUndo() const
1181 {
1182     if( mpDoc && mpDoc->IsUndoEnabled() )
1183     {
1184         sd::UndoManager* pUndoManager = mpDoc ? mpDoc->GetUndoManager() : 0;
1185         return pUndoManager && pUndoManager->IsInListAction();
1186     }
1187     else
1188     {
1189         return false;
1190     }
1191 }
1192 
1193 void View::AddCustomHdl()
1194 {
1195     maSmartTags.addCustomHandles( aHdl );
1196 }
1197 
1198 void View::updateHandles()
1199 {
1200     AdjustMarkHdl();
1201 }
1202 
1203 SdrViewContext View::GetContext() const
1204 {
1205     SdrViewContext eContext = SDRCONTEXT_STANDARD;
1206     if( maSmartTags.getContext( eContext ) )
1207         return eContext;
1208     else
1209         return FmFormView::GetContext();
1210 }
1211 
1212 sal_Bool View::HasMarkablePoints() const
1213 {
1214     if( maSmartTags.HasMarkablePoints() )
1215         return true;
1216     else
1217         return FmFormView::HasMarkablePoints();
1218 }
1219 
1220 sal_uLong View::GetMarkablePointCount() const
1221 {
1222     sal_uLong nCount = FmFormView::GetMarkablePointCount();
1223     nCount += maSmartTags.GetMarkablePointCount();
1224     return nCount;
1225 }
1226 
1227 sal_Bool View::HasMarkedPoints() const
1228 {
1229     if( maSmartTags.HasMarkedPoints() )
1230         return true;
1231     else
1232         return FmFormView::HasMarkedPoints();
1233 }
1234 
1235 sal_uLong View::GetMarkedPointCount() const
1236 {
1237     sal_uLong nCount = FmFormView::GetMarkedPointCount();
1238     nCount += maSmartTags.GetMarkedPointCount();
1239     return nCount;
1240 }
1241 
1242 sal_Bool View::IsPointMarkable(const SdrHdl& rHdl) const
1243 {
1244     if( maSmartTags.IsPointMarkable( rHdl ) )
1245         return true;
1246     else
1247         return FmFormView::IsPointMarkable( rHdl );
1248 }
1249 
1250 sal_Bool View::MarkPoint(SdrHdl& rHdl, sal_Bool bUnmark )
1251 {
1252     if( maSmartTags.MarkPoint( rHdl, bUnmark ) )
1253         return true;
1254     else
1255         return FmFormView::MarkPoint( rHdl, bUnmark );
1256 }
1257 
1258 sal_Bool View::MarkPoints(const Rectangle* pRect, sal_Bool bUnmark)
1259 {
1260     if( maSmartTags.MarkPoints( pRect, bUnmark ) )
1261         return true;
1262     else
1263         return FmFormView::MarkPoints( pRect, bUnmark );
1264 }
1265 
1266 void View::CheckPossibilities()
1267 {
1268     FmFormView::CheckPossibilities();
1269     maSmartTags.CheckPossibilities();
1270 }
1271 
1272 void View::OnBeginPasteOrDrop( PasteOrDropInfos* /*pInfos*/ )
1273 {
1274 }
1275 
1276 /** this is called after a paste or drop operation, make sure that the newly inserted paragraphs
1277     get the correct style sheet. */
1278 void View::OnEndPasteOrDrop( PasteOrDropInfos* pInfos )
1279 {
1280     SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( GetTextEditObject() );
1281     SdrOutliner* pOutliner = GetTextEditOutliner();
1282     if( pOutliner && pTextObj && pTextObj->GetPage() )
1283     {
1284         SdPage* pPage = static_cast< SdPage* >( pTextObj->GetPage() );
1285 
1286         SfxStyleSheet* pStyleSheet = 0;
1287 
1288         const PresObjKind eKind = pPage->GetPresObjKind(pTextObj);
1289         if( eKind != PRESOBJ_NONE )
1290             pStyleSheet = pPage->GetStyleSheetForPresObj(eKind);
1291         else
1292             pStyleSheet = pTextObj->GetStyleSheet();
1293 
1294         if( eKind == PRESOBJ_OUTLINE )
1295         {
1296             // for outline shapes, set the correct outline style sheet for each
1297             // new paragraph, depending on the paragraph depth
1298             SfxStyleSheetBasePool* pStylePool = GetDoc()->GetStyleSheetPool();
1299 
1300             for ( sal_uInt16 nPara = pInfos->nStartPara; nPara <= pInfos->nEndPara; nPara++ )
1301             {
1302                 sal_Int16 nDepth = pOutliner->GetDepth( nPara );
1303 
1304                 SfxStyleSheet* pStyle = 0;
1305                 if( nDepth > 0 )
1306                 {
1307                     String aStyleSheetName( pStyleSheet->GetName() );
1308                     aStyleSheetName.Erase( aStyleSheetName.Len() - 1, 1 );
1309                     aStyleSheetName += String::CreateFromInt32( nDepth );
1310                     pStyle = static_cast<SfxStyleSheet*>( pStylePool->Find( aStyleSheetName, pStyleSheet->GetFamily() ) );
1311                     DBG_ASSERT( pStyle, "sd::View::OnEndPasteOrDrop(), Style not found!" );
1312                 }
1313 
1314                 if( !pStyle )
1315                     pStyle = pStyleSheet;
1316 
1317                 pOutliner->SetStyleSheet( nPara, pStyle );
1318             }
1319         }
1320         else
1321         {
1322             // just put the object style on each new paragraph
1323             for ( sal_uInt16 nPara = pInfos->nStartPara; nPara <= pInfos->nEndPara; nPara++ )
1324             {
1325                 pOutliner->SetStyleSheet( nPara, pStyleSheet );
1326             }
1327         }
1328     }
1329 }
1330 
1331 } // end of namespace sd
1332