LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdedxv.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 1094 0.0 %
Date: 2014-04-14 Functions: 0 67 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <com/sun/star/i18n/WordType.hpp>
      21             : #include <svtools/accessibilityoptions.hxx>
      22             : #include <svx/svdedxv.hxx>
      23             : #include <svl/solar.hrc>
      24             : #include <svl/itemiter.hxx>
      25             : #include <vcl/msgbox.hxx>
      26             : #include <vcl/hatch.hxx>
      27             : #include <svl/whiter.hxx>
      28             : #include <svl/style.hxx>
      29             : #include <editeng/editstat.hxx>
      30             : #include <vcl/cursor.hxx>
      31             : #include <editeng/unotext.hxx>
      32             : #include <editeng/editdata.hxx>
      33             : #include <editeng/editeng.hxx>
      34             : #include <editeng/editobj.hxx>
      35             : #include <editeng/outlobj.hxx>
      36             : #include <editeng/scripttypeitem.hxx>
      37             : #include <svx/svdoutl.hxx>
      38             : #include <svx/sdtfchim.hxx>
      39             : #include <svx/svdotext.hxx>
      40             : #include <svx/svdundo.hxx>
      41             : #include "svx/svditer.hxx"
      42             : #include "svx/svdpagv.hxx"
      43             : #include "svx/svdpage.hxx"
      44             : #include "svx/svdetc.hxx"
      45             : #include "svx/svdotable.hxx"
      46             : #include <svx/selectioncontroller.hxx>
      47             : #ifdef DBG_UTIL
      48             : #include <svdibrow.hxx>
      49             : #endif
      50             : #include <svx/svddrgv.hxx>
      51             : #include "svx/svdstr.hrc"
      52             : #include "svx/svdglob.hxx"
      53             : #include "svx/globl3d.hxx"
      54             : #include <editeng/outliner.hxx>
      55             : #include <editeng/adjustitem.hxx>
      56             : #include <svtools/colorcfg.hxx>
      57             : #include <vcl/svapp.hxx>
      58             : #include <svx/sdrpaintwindow.hxx>
      59             : #include <svx/sdrundomanager.hxx>
      60             : #include <svx/sdr/overlay/overlaytools.hxx>
      61             : #include <svx/sdr/table/tablecontroller.hxx>
      62             : #include <drawinglayer/processor2d/processor2dtools.hxx>
      63             : 
      64             : 
      65             : 
      66           0 : void SdrObjEditView::ImpClearVars()
      67             : {
      68           0 :     bQuickTextEditMode=true;
      69           0 :     bMacroMode=true;
      70           0 :     pTextEditOutliner=NULL;
      71           0 :     pTextEditOutlinerView=NULL;
      72           0 :     pTextEditPV=NULL;
      73           0 :     pTextEditWin=NULL;
      74           0 :     pTextEditCursorMerker=NULL;
      75           0 :     pEditPara=NULL;
      76           0 :     bTextEditNewObj=false;
      77           0 :     bMacroDown=false;
      78           0 :     pMacroObj=NULL;
      79           0 :     pMacroPV=NULL;
      80           0 :     pMacroWin=NULL;
      81           0 :     nMacroTol=0;
      82           0 :     bTextEditDontDelete=false;
      83           0 :     bTextEditOnlyOneView=false;
      84           0 : }
      85             : 
      86           0 : SdrObjEditView::SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut):
      87             :     SdrGlueEditView(pModel1,pOut),
      88           0 :     mpOldTextEditUndoManager(0)
      89             : {
      90           0 :     ImpClearVars();
      91           0 : }
      92             : 
      93           0 : SdrObjEditView::~SdrObjEditView()
      94             : {
      95           0 :     pTextEditWin = NULL;            // so there's no ShowCursor in SdrEndTextEdit
      96           0 :     if (IsTextEdit())
      97           0 :         SdrEndTextEdit();
      98           0 :     delete pTextEditOutliner;
      99           0 :     delete mpOldTextEditUndoManager;
     100           0 : }
     101             : 
     102             : 
     103             : 
     104           0 : bool SdrObjEditView::IsAction() const
     105             : {
     106           0 :     return IsMacroObj() || SdrGlueEditView::IsAction();
     107             : }
     108             : 
     109           0 : void SdrObjEditView::MovAction(const Point& rPnt)
     110             : {
     111           0 :     if (IsMacroObj()) MovMacroObj(rPnt);
     112           0 :     SdrGlueEditView::MovAction(rPnt);
     113           0 : }
     114             : 
     115           0 : void SdrObjEditView::EndAction()
     116             : {
     117           0 :     if (IsMacroObj()) EndMacroObj();
     118           0 :     SdrGlueEditView::EndAction();
     119           0 : }
     120             : 
     121           0 : void SdrObjEditView::BckAction()
     122             : {
     123           0 :     BrkMacroObj();
     124           0 :     SdrGlueEditView::BckAction();
     125           0 : }
     126             : 
     127           0 : void SdrObjEditView::BrkAction()
     128             : {
     129           0 :     BrkMacroObj();
     130           0 :     SdrGlueEditView::BrkAction();
     131           0 : }
     132             : 
     133           0 : void SdrObjEditView::TakeActionRect(Rectangle& rRect) const
     134             : {
     135           0 :     if (IsMacroObj()) {
     136           0 :         rRect=pMacroObj->GetCurrentBoundRect();
     137             :     } else {
     138           0 :         SdrGlueEditView::TakeActionRect(rRect);
     139             :     }
     140           0 : }
     141             : 
     142           0 : void SdrObjEditView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
     143             : {
     144           0 :     SdrGlueEditView::Notify(rBC,rHint);
     145             :     // change of printer while editing
     146           0 :     SdrHint* pSdrHint=PTR_CAST(SdrHint,&rHint);
     147           0 :     if (pSdrHint!=NULL && pTextEditOutliner!=NULL) {
     148           0 :         SdrHintKind eKind=pSdrHint->GetKind();
     149           0 :         if (eKind==HINT_REFDEVICECHG) {
     150           0 :             pTextEditOutliner->SetRefDevice(pMod->GetRefDevice());
     151             :         }
     152           0 :         if (eKind==HINT_DEFAULTTABCHG) {
     153           0 :             pTextEditOutliner->SetDefTab(pMod->GetDefaultTabulator());
     154             :         }
     155             :         if (eKind==HINT_DEFFONTHGTCHG) {
     156             : 
     157             :         }
     158           0 :         if (eKind==HINT_MODELSAVED) {
     159           0 :             pTextEditOutliner->ClearModifyFlag();
     160             :         }
     161             :     }
     162           0 : }
     163             : 
     164           0 : void SdrObjEditView::ModelHasChanged()
     165             : {
     166           0 :     SdrGlueEditView::ModelHasChanged();
     167           0 :     if (mxTextEditObj.is() && !mxTextEditObj->IsInserted()) SdrEndTextEdit(); // object deleted
     168             :     // TextEditObj changed?
     169           0 :     if (IsTextEdit()) {
     170           0 :         SdrTextObj* pTextObj=dynamic_cast<SdrTextObj*>( mxTextEditObj.get() );
     171           0 :         if (pTextObj!=NULL) {
     172           0 :             sal_uIntPtr nOutlViewAnz=pTextEditOutliner->GetViewCount();
     173           0 :             bool bAreaChg=false;
     174           0 :             bool bAnchorChg=false;
     175           0 :             bool bColorChg=false;
     176           0 :             bool bContourFrame=pTextObj->IsContourTextFrame();
     177           0 :             EVAnchorMode eNewAnchor(ANCHOR_VCENTER_HCENTER);
     178           0 :             Rectangle aOldArea(aMinTextEditArea);
     179           0 :             aOldArea.Union(aTextEditArea);
     180           0 :             Color aNewColor;
     181             :             { // check area
     182           0 :                 Size aPaperMin1;
     183           0 :                 Size aPaperMax1;
     184           0 :                 Rectangle aEditArea1;
     185           0 :                 Rectangle aMinArea1;
     186           0 :                 pTextObj->TakeTextEditArea(&aPaperMin1,&aPaperMax1,&aEditArea1,&aMinArea1);
     187             : 
     188           0 :                 Point aPvOfs(pTextObj->GetTextEditOffset());
     189             :                 // Hack for calc, transform position of edit object according
     190             :                 // to current zoom so as objects relative position to grid
     191             :                 // appears stable
     192           0 :                 aEditArea1 += pTextObj->GetGridOffset();
     193           0 :                 aMinArea1 += pTextObj->GetGridOffset();
     194           0 :                 aEditArea1.Move(aPvOfs.X(),aPvOfs.Y());
     195           0 :                 aMinArea1.Move(aPvOfs.X(),aPvOfs.Y());
     196           0 :                 Rectangle aNewArea(aMinArea1);
     197           0 :                 aNewArea.Union(aEditArea1);
     198             : 
     199           0 :                 if (aNewArea!=aOldArea || aEditArea1!=aTextEditArea || aMinArea1!=aMinTextEditArea ||
     200           0 :                     pTextEditOutliner->GetMinAutoPaperSize()!=aPaperMin1 || pTextEditOutliner->GetMaxAutoPaperSize()!=aPaperMax1) {
     201           0 :                     aTextEditArea=aEditArea1;
     202           0 :                     aMinTextEditArea=aMinArea1;
     203           0 :                     pTextEditOutliner->SetUpdateMode(false);
     204           0 :                     pTextEditOutliner->SetMinAutoPaperSize(aPaperMin1);
     205           0 :                     pTextEditOutliner->SetMaxAutoPaperSize(aPaperMax1);
     206           0 :                     pTextEditOutliner->SetPaperSize(Size(0,0)); // re-format Outliner
     207           0 :                     if (!bContourFrame) {
     208           0 :                         pTextEditOutliner->ClearPolygon();
     209           0 :                         sal_uIntPtr nStat=pTextEditOutliner->GetControlWord();
     210           0 :                         nStat|=EE_CNTRL_AUTOPAGESIZE;
     211           0 :                         pTextEditOutliner->SetControlWord(nStat);
     212             :                     } else {
     213           0 :                         sal_uIntPtr nStat=pTextEditOutliner->GetControlWord();
     214           0 :                         nStat&=~EE_CNTRL_AUTOPAGESIZE;
     215           0 :                         pTextEditOutliner->SetControlWord(nStat);
     216           0 :                         Rectangle aAnchorRect;
     217           0 :                         pTextObj->TakeTextAnchorRect(aAnchorRect);
     218           0 :                         pTextObj->ImpSetContourPolygon(*pTextEditOutliner,aAnchorRect, true);
     219             :                     }
     220           0 :                     for (sal_uIntPtr nOV=0; nOV<nOutlViewAnz; nOV++) {
     221           0 :                         OutlinerView* pOLV=pTextEditOutliner->GetView(nOV);
     222           0 :                         sal_uIntPtr nStat0=pOLV->GetControlWord();
     223           0 :                         sal_uIntPtr nStat=nStat0;
     224             :                         // AutoViewSize only if not ContourFrame.
     225           0 :                         if (!bContourFrame) nStat|=EV_CNTRL_AUTOSIZE;
     226           0 :                         else nStat&=~EV_CNTRL_AUTOSIZE;
     227           0 :                         if (nStat!=nStat0) pOLV->SetControlWord(nStat);
     228             :                     }
     229           0 :                     pTextEditOutliner->SetUpdateMode(true);
     230           0 :                     bAreaChg=true;
     231             :                 }
     232             :             }
     233           0 :             if (pTextEditOutlinerView!=NULL) { // check fill and anchor
     234           0 :                 EVAnchorMode eOldAnchor=pTextEditOutlinerView->GetAnchorMode();
     235           0 :                 eNewAnchor=(EVAnchorMode)pTextObj->GetOutlinerViewAnchorMode();
     236           0 :                 bAnchorChg=eOldAnchor!=eNewAnchor;
     237           0 :                 Color aOldColor(pTextEditOutlinerView->GetBackgroundColor());
     238           0 :                 aNewColor = GetTextEditBackgroundColor(*this);
     239           0 :                 bColorChg=aOldColor!=aNewColor;
     240             :             }
     241             :             // refresh always when it's a contour frame. That
     242             :             // refresh is necessary since it triggers the repaint
     243             :             // which makes the Handles visible. Changes at TakeTextRect()
     244             :             // seem to have resulted in a case where no refresh is executed.
     245             :             // Before that, a refresh must have been always executed
     246             :             // (else this error would have happened earlier), thus I
     247             :             // even think here a refresh should be done always.
     248             :             // Since follow-up problems cannot even be guessed I only
     249             :             // add this one more case to the if below.
     250             :             // BTW: It's VERY bad style that here, inside ModelHasChanged()
     251             :             // the outliner is again massively changed for the text object
     252             :             // in text edit mode. Normally, all necessary data should be
     253             :             // set at SdrBeginTextEdit(). Some changes and value assigns in
     254             :             // SdrBeginTextEdit() are completely useless since they are set here
     255             :             // again on ModelHasChanged().
     256           0 :             if (bContourFrame || bAreaChg || bAnchorChg || bColorChg)
     257             :             {
     258           0 :                 for (sal_uIntPtr nOV=0; nOV<nOutlViewAnz; nOV++)
     259             :                 {
     260           0 :                     OutlinerView* pOLV=pTextEditOutliner->GetView(nOV);
     261             :                     { // invalidate old OutlinerView area
     262           0 :                         Window* pWin=pOLV->GetWindow();
     263           0 :                         Rectangle aTmpRect(aOldArea);
     264           0 :                         sal_uInt16 nPixSiz=pOLV->GetInvalidateMore()+1;
     265           0 :                         Size aMore(pWin->PixelToLogic(Size(nPixSiz,nPixSiz)));
     266           0 :                         aTmpRect.Left()-=aMore.Width();
     267           0 :                         aTmpRect.Right()+=aMore.Width();
     268           0 :                         aTmpRect.Top()-=aMore.Height();
     269           0 :                         aTmpRect.Bottom()+=aMore.Height();
     270           0 :                         InvalidateOneWin(*pWin,aTmpRect);
     271             :                     }
     272           0 :                     if (bAnchorChg)
     273           0 :                         pOLV->SetAnchorMode(eNewAnchor);
     274           0 :                     if (bColorChg)
     275           0 :                         pOLV->SetBackgroundColor( aNewColor );
     276             : 
     277           0 :                     pOLV->SetOutputArea(aTextEditArea); // because otherwise, we're not re-anchoring correctly
     278           0 :                     ImpInvalidateOutlinerView(*pOLV);
     279             :                 }
     280           0 :                 pTextEditOutlinerView->ShowCursor();
     281             :             }
     282             :         }
     283           0 :         ImpMakeTextCursorAreaVisible();
     284             :     }
     285           0 : }
     286             : 
     287             : 
     288             : // TextEdit
     289             : 
     290             : 
     291           0 : void SdrObjEditView::TextEditDrawing(SdrPaintWindow& rPaintWindow) const
     292             : {
     293             :     // draw old text edit stuff
     294           0 :     if(IsTextEdit())
     295             :     {
     296           0 :         const SdrOutliner* pActiveOutliner = GetTextEditOutliner();
     297             : 
     298           0 :         if(pActiveOutliner)
     299             :         {
     300           0 :             const sal_uInt32 nViewAnz(pActiveOutliner->GetViewCount());
     301             : 
     302           0 :             if(nViewAnz)
     303             :             {
     304           0 :                 const Region& rRedrawRegion = rPaintWindow.GetRedrawRegion();
     305           0 :                 const Rectangle aCheckRect(rRedrawRegion.GetBoundRect());
     306             : 
     307           0 :                 for(sal_uInt32 i(0); i < nViewAnz; i++)
     308             :                 {
     309           0 :                     OutlinerView* pOLV = pActiveOutliner->GetView(i);
     310             : 
     311           0 :                     if(pOLV->GetWindow() == &rPaintWindow.GetOutputDevice())
     312             :                     {
     313           0 :                         ImpPaintOutlinerView(*pOLV, aCheckRect, rPaintWindow.GetTargetOutputDevice());
     314           0 :                         return;
     315             :                     }
     316             :                 }
     317             :             }
     318             :         }
     319             :     }
     320             : }
     321             : 
     322           0 : void SdrObjEditView::ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect, OutputDevice& rTargetDevice) const
     323             : {
     324           0 :     const SdrTextObj* pText = PTR_CAST(SdrTextObj,GetTextEditObject());
     325           0 :     bool bTextFrame(pText && pText->IsTextFrame());
     326           0 :     bool bFitToSize(0 != (pTextEditOutliner->GetControlWord() & EE_CNTRL_STRETCHING));
     327           0 :     bool bModifyMerk(pTextEditOutliner->IsModified()); // #43095#
     328           0 :     Rectangle aBlankRect(rOutlView.GetOutputArea());
     329           0 :     aBlankRect.Union(aMinTextEditArea);
     330           0 :     Rectangle aPixRect(rTargetDevice.LogicToPixel(aBlankRect));
     331           0 :     aBlankRect.Intersection(rRect);
     332           0 :     rOutlView.GetOutliner()->SetUpdateMode(true); // Bugfix #22596#
     333           0 :     rOutlView.Paint(aBlankRect, &rTargetDevice);
     334             : 
     335           0 :     if(!bModifyMerk)
     336             :     {
     337             :         // #43095#
     338           0 :         pTextEditOutliner->ClearModifyFlag();
     339             :     }
     340             : 
     341           0 :     if(bTextFrame && !bFitToSize)
     342             :     {
     343             :         // completely reworked to use primitives; this ensures same look and functionality
     344           0 :         const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
     345             :         drawinglayer::processor2d::BaseProcessor2D* pProcessor = drawinglayer::processor2d::createProcessor2DFromOutputDevice(
     346             :             rTargetDevice,
     347           0 :             aViewInformation2D);
     348             : 
     349           0 :         if(pProcessor)
     350             :         {
     351           0 :             const bool bMerk(rTargetDevice.IsMapModeEnabled());
     352           0 :             const basegfx::B2DRange aRange(aPixRect.Left(), aPixRect.Top(), aPixRect.Right(), aPixRect.Bottom());
     353           0 :             const SvtOptionsDrawinglayer aSvtOptionsDrawinglayer;
     354           0 :             const Color aHilightColor(aSvtOptionsDrawinglayer.getHilightColor());
     355           0 :             const double fTransparence(aSvtOptionsDrawinglayer.GetTransparentSelectionPercent() * 0.01);
     356           0 :             const sal_uInt16 nPixSiz(rOutlView.GetInvalidateMore() - 1);
     357             :             const drawinglayer::primitive2d::Primitive2DReference xReference(
     358             :                 new drawinglayer::primitive2d::OverlayRectanglePrimitive(
     359             :                     aRange,
     360             :                     aHilightColor.getBColor(),
     361             :                     fTransparence,
     362           0 :                     std::max(6, nPixSiz - 2), // grow
     363             :                     0.0, // shrink
     364           0 :                     0.0));
     365           0 :             const drawinglayer::primitive2d::Primitive2DSequence aSequence(&xReference, 1);
     366             : 
     367           0 :             rTargetDevice.EnableMapMode(false);
     368           0 :             pProcessor->process(aSequence);
     369           0 :             rTargetDevice.EnableMapMode(bMerk);
     370           0 :             delete pProcessor;
     371           0 :         }
     372             :     }
     373             : 
     374           0 :     rOutlView.ShowCursor();
     375           0 : }
     376             : 
     377           0 : void SdrObjEditView::ImpInvalidateOutlinerView(OutlinerView& rOutlView) const
     378             : {
     379           0 :     Window* pWin = rOutlView.GetWindow();
     380             : 
     381           0 :     if(pWin)
     382             :     {
     383           0 :         const SdrTextObj* pText = PTR_CAST(SdrTextObj,GetTextEditObject());
     384           0 :         bool bTextFrame(pText && pText->IsTextFrame());
     385           0 :         bool bFitToSize(pText && pText->IsFitToSize());
     386             : 
     387           0 :         if(bTextFrame && !bFitToSize)
     388             :         {
     389           0 :             Rectangle aBlankRect(rOutlView.GetOutputArea());
     390           0 :             aBlankRect.Union(aMinTextEditArea);
     391           0 :             Rectangle aPixRect(pWin->LogicToPixel(aBlankRect));
     392           0 :             sal_uInt16 nPixSiz(rOutlView.GetInvalidateMore() - 1);
     393             : 
     394           0 :             aPixRect.Left()--;
     395           0 :             aPixRect.Top()--;
     396           0 :             aPixRect.Right()++;
     397           0 :             aPixRect.Bottom()++;
     398             : 
     399             :             {
     400             :                 // limit xPixRect because of driver problems when pixel coordinates are too far out
     401           0 :                 Size aMaxXY(pWin->GetOutputSizePixel());
     402           0 :                 long a(2 * nPixSiz);
     403           0 :                 long nMaxX(aMaxXY.Width() + a);
     404           0 :                 long nMaxY(aMaxXY.Height() + a);
     405             : 
     406           0 :                 if (aPixRect.Left  ()<-a) aPixRect.Left()=-a;
     407           0 :                 if (aPixRect.Top   ()<-a) aPixRect.Top ()=-a;
     408           0 :                 if (aPixRect.Right ()>nMaxX) aPixRect.Right ()=nMaxX;
     409           0 :                 if (aPixRect.Bottom()>nMaxY) aPixRect.Bottom()=nMaxY;
     410             :             }
     411             : 
     412           0 :             Rectangle aOuterPix(aPixRect);
     413           0 :             aOuterPix.Left()-=nPixSiz;
     414           0 :             aOuterPix.Top()-=nPixSiz;
     415           0 :             aOuterPix.Right()+=nPixSiz;
     416           0 :             aOuterPix.Bottom()+=nPixSiz;
     417             : 
     418           0 :             bool bMerk(pWin->IsMapModeEnabled());
     419           0 :             pWin->EnableMapMode(false);
     420           0 :             pWin->Invalidate(aOuterPix);
     421           0 :             pWin->EnableMapMode(bMerk);
     422             :         }
     423             :     }
     424           0 : }
     425             : 
     426           0 : OutlinerView* SdrObjEditView::ImpMakeOutlinerView(Window* pWin, bool /*bNoPaint*/, OutlinerView* pGivenView) const
     427             : {
     428             :     // background
     429           0 :     Color aBackground(GetTextEditBackgroundColor(*this));
     430           0 :     SdrTextObj* pText = dynamic_cast< SdrTextObj * >( mxTextEditObj.get() );
     431           0 :     bool bTextFrame=pText!=NULL && pText->IsTextFrame();
     432           0 :     bool bContourFrame=pText!=NULL && pText->IsContourTextFrame();
     433             :     // create OutlinerView
     434           0 :     OutlinerView* pOutlView=pGivenView;
     435           0 :     pTextEditOutliner->SetUpdateMode(false);
     436           0 :     if (pOutlView==NULL) pOutlView = new OutlinerView(pTextEditOutliner,pWin);
     437           0 :     else pOutlView->SetWindow(pWin);
     438             :     // disallow scrolling
     439           0 :     sal_uIntPtr nStat=pOutlView->GetControlWord();
     440           0 :     nStat&=~EV_CNTRL_AUTOSCROLL;
     441             :     // AutoViewSize only if not ContourFrame.
     442           0 :     if (!bContourFrame) nStat|=EV_CNTRL_AUTOSIZE;
     443           0 :     if (bTextFrame) {
     444           0 :         sal_uInt16 nPixSiz=aHdl.GetHdlSize()*2+1;
     445           0 :         nStat|=EV_CNTRL_INVONEMORE;
     446           0 :         pOutlView->SetInvalidateMore(nPixSiz);
     447             :     }
     448           0 :     pOutlView->SetControlWord(nStat);
     449           0 :     pOutlView->SetBackgroundColor( aBackground );
     450           0 :     if (pText!=NULL)
     451             :     {
     452           0 :         pOutlView->SetAnchorMode((EVAnchorMode)(pText->GetOutlinerViewAnchorMode()));
     453           0 :         pTextEditOutliner->SetFixedCellHeight(((const SdrTextFixedCellHeightItem&)pText->GetMergedItem(SDRATTR_TEXT_USEFIXEDCELLHEIGHT)).GetValue());
     454             :     }
     455             :     // do update before setting output area so that aTextEditArea can be recalculated
     456           0 :     pTextEditOutliner->SetUpdateMode(true);
     457           0 :     pOutlView->SetOutputArea(aTextEditArea);
     458           0 :     ImpInvalidateOutlinerView(*pOutlView);
     459           0 :     return pOutlView;
     460             : }
     461             : 
     462           0 : IMPL_LINK(SdrObjEditView,ImpOutlinerStatusEventHdl,EditStatus*,pEditStat)
     463             : {
     464           0 :     if(pTextEditOutliner )
     465             :     {
     466           0 :         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj * >( mxTextEditObj.get() );
     467           0 :         if( pTextObj )
     468             :         {
     469           0 :             pTextObj->onEditOutlinerStatusEvent( pEditStat );
     470             :         }
     471             :     }
     472           0 :     return 0;
     473             : }
     474             : 
     475           0 : IMPL_LINK(SdrObjEditView,ImpOutlinerCalcFieldValueHdl,EditFieldInfo*,pFI)
     476             : {
     477           0 :     bool bOk=false;
     478           0 :     OUString& rStr=pFI->GetRepresentation();
     479           0 :     rStr = "";
     480           0 :     SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mxTextEditObj.get() );
     481           0 :     if (pTextObj!=NULL) {
     482           0 :         Color* pTxtCol=NULL;
     483           0 :         Color* pFldCol=NULL;
     484           0 :         bOk=pTextObj->CalcFieldValue(pFI->GetField(),pFI->GetPara(),pFI->GetPos(),true,pTxtCol,pFldCol,rStr);
     485           0 :         if (bOk) {
     486           0 :             if (pTxtCol!=NULL) {
     487           0 :                 pFI->SetTxtColor(*pTxtCol);
     488           0 :                 delete pTxtCol;
     489             :             }
     490           0 :             if (pFldCol!=NULL) {
     491           0 :                 pFI->SetFldColor(*pFldCol);
     492           0 :                 delete pFldCol;
     493             :             } else {
     494           0 :                 pFI->SetFldColor(Color(COL_LIGHTGRAY)); // TODO: remove this later on (357)
     495             :             }
     496             :         }
     497             :     }
     498           0 :     Outliner& rDrawOutl=pMod->GetDrawOutliner(pTextObj);
     499           0 :     Link aDrawOutlLink=rDrawOutl.GetCalcFieldValueHdl();
     500           0 :     if (!bOk && aDrawOutlLink.IsSet()) {
     501           0 :         aDrawOutlLink.Call(pFI);
     502           0 :         bOk = !rStr.isEmpty();
     503             :     }
     504           0 :     if (!bOk && aOldCalcFieldValueLink.IsSet()) {
     505           0 :         return aOldCalcFieldValueLink.Call(pFI);
     506             :     }
     507           0 :     return 0;
     508             : }
     509             : 
     510           0 : IMPL_LINK(SdrObjEditView, EndTextEditHdl, SdrUndoManager*, /*pUndoManager*/)
     511             : {
     512           0 :     SdrEndTextEdit();
     513           0 :     return 0;
     514             : }
     515             : 
     516           0 : SdrUndoManager* SdrObjEditView::getSdrUndoManagerForEnhancedTextEdit() const
     517             : {
     518             :     // default returns registered UndoManager
     519           0 :     return GetModel() ? dynamic_cast< SdrUndoManager* >(GetModel()->GetSdrUndoManager()) : 0;
     520             : }
     521             : 
     522           0 : bool SdrObjEditView::SdrBeginTextEdit(
     523             :     SdrObject* pObj, SdrPageView* pPV, Window* pWin,
     524             :     bool bIsNewObj, SdrOutliner* pGivenOutliner,
     525             :     OutlinerView* pGivenOutlinerView,
     526             :     bool bDontDeleteOutliner, bool bOnlyOneView,
     527             :     bool bGrabFocus)
     528             : {
     529           0 :     SdrEndTextEdit();
     530             : 
     531           0 :     if( dynamic_cast< SdrTextObj* >( pObj ) == 0 )
     532           0 :         return false; // currently only possible with text objects
     533             : 
     534           0 :     if(bGrabFocus && pWin)
     535             :     {
     536             :         // attention, this call may cause an EndTextEdit() call to this view
     537           0 :         pWin->GrabFocus(); // to force the cursor into the edit view
     538             :     }
     539             : 
     540           0 :     bTextEditDontDelete=bDontDeleteOutliner && pGivenOutliner!=NULL;
     541           0 :     bTextEditOnlyOneView=bOnlyOneView;
     542           0 :     bTextEditNewObj=bIsNewObj;
     543           0 :     const sal_uInt32 nWinAnz(PaintWindowCount());
     544             :     sal_uInt32 i;
     545           0 :     bool bBrk(false);
     546             :     // break, when no object given
     547             : 
     548           0 :     if(!pObj)
     549             :     {
     550           0 :         bBrk = true;
     551             :     }
     552             : 
     553           0 :     if(!bBrk && !pWin)
     554             :     {
     555           0 :         for(i = 0L; i < nWinAnz && !pWin; i++)
     556             :         {
     557           0 :             SdrPaintWindow* pPaintWindow = GetPaintWindow(i);
     558             : 
     559           0 :             if(OUTDEV_WINDOW == pPaintWindow->GetOutputDevice().GetOutDevType())
     560             :             {
     561           0 :                 pWin = (Window*)(&pPaintWindow->GetOutputDevice());
     562             :             }
     563             :         }
     564             : 
     565             :         // break, when no window exists
     566           0 :         if(!pWin)
     567             :         {
     568           0 :             bBrk = true;
     569             :         }
     570             :     }
     571             : 
     572           0 :     if(!bBrk && !pPV)
     573             :     {
     574           0 :         pPV = GetSdrPageView();
     575             : 
     576             :         // break, when no PageView for the object exists
     577           0 :         if(!pPV)
     578             :         {
     579           0 :             bBrk = true;
     580             :         }
     581             :     }
     582             : 
     583           0 :     if(pObj && pPV)
     584             :     {
     585             :         // no TextEdit on objects in locked Layer
     586           0 :         if(pPV->GetLockedLayers().IsSet(pObj->GetLayer()))
     587             :         {
     588           0 :             bBrk = true;
     589             :         }
     590             :     }
     591             : 
     592           0 :     if(pTextEditOutliner)
     593             :     {
     594             :         OSL_FAIL("SdrObjEditView::SdrBeginTextEdit(): Old Outliner still exists.");
     595           0 :         delete pTextEditOutliner;
     596           0 :         pTextEditOutliner = 0L;
     597             :     }
     598             : 
     599           0 :     if(!bBrk)
     600             :     {
     601           0 :         pTextEditWin=pWin;
     602           0 :         pTextEditPV=pPV;
     603           0 :         mxTextEditObj.reset( pObj );
     604           0 :         pTextEditOutliner=pGivenOutliner;
     605           0 :         if (pTextEditOutliner==NULL)
     606           0 :             pTextEditOutliner = SdrMakeOutliner( OUTLINERMODE_TEXTOBJECT, mxTextEditObj->GetModel() );
     607             : 
     608             :         {
     609           0 :             SvtAccessibilityOptions aOptions;
     610           0 :             pTextEditOutliner->ForceAutoColor( aOptions.GetIsAutomaticFontColor() );
     611             :         }
     612             : 
     613           0 :         bool bEmpty = mxTextEditObj->GetOutlinerParaObject()==NULL;
     614             : 
     615           0 :         aOldCalcFieldValueLink=pTextEditOutliner->GetCalcFieldValueHdl();
     616             :         // FieldHdl has to be set by SdrBeginTextEdit, because this call an UpdateFields
     617           0 :         pTextEditOutliner->SetCalcFieldValueHdl(LINK(this,SdrObjEditView,ImpOutlinerCalcFieldValueHdl));
     618           0 :         pTextEditOutliner->SetBeginPasteOrDropHdl(LINK(this,SdrObjEditView,BeginPasteOrDropHdl));
     619           0 :         pTextEditOutliner->SetEndPasteOrDropHdl(LINK(this,SdrObjEditView, EndPasteOrDropHdl));
     620             : 
     621             :         // It is just necessary to make the visualized page known. Set it.
     622           0 :         pTextEditOutliner->setVisualizedPage(pPV->GetPage());
     623             : 
     624           0 :         pTextEditOutliner->SetTextObjNoInit( dynamic_cast< SdrTextObj* >( mxTextEditObj.get() ) );
     625             : 
     626           0 :         if(mxTextEditObj->BegTextEdit(*pTextEditOutliner))
     627             :         {
     628           0 :             SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mxTextEditObj.get() );
     629             :             DBG_ASSERT( pTextObj, "svx::SdrObjEditView::BegTextEdit(), no text object?" );
     630           0 :             if( !pTextObj )
     631           0 :                 return false;
     632             : 
     633             :             // switch off any running TextAnimations
     634           0 :             pTextObj->SetTextAnimationAllowed(false);
     635             : 
     636             :             // remember old cursor
     637           0 :             if (pTextEditOutliner->GetViewCount()!=0)
     638             :             {
     639           0 :                 OutlinerView* pTmpOLV=pTextEditOutliner->RemoveView(static_cast<size_t>(0));
     640           0 :                 if(pTmpOLV!=NULL && pTmpOLV!=pGivenOutlinerView)
     641           0 :                     delete pTmpOLV;
     642             :             }
     643             : 
     644             :             // Determine EditArea via TakeTextEditArea.
     645             :             // TODO: This could theoretically be left out, because TakeTextRect() calculates the aTextEditArea,
     646             :             // but aMinTextEditArea has to happen, too (therefore leaving this in right now)
     647           0 :             pTextObj->TakeTextEditArea(NULL,NULL,&aTextEditArea,&aMinTextEditArea);
     648             : 
     649           0 :             Rectangle aTextRect;
     650           0 :             Rectangle aAnchorRect;
     651             :             pTextObj->TakeTextRect(*pTextEditOutliner, aTextRect, true,
     652           0 :                 &aAnchorRect /* Give true here, not false */);
     653             : 
     654           0 :             if ( !pTextObj->IsContourTextFrame() )
     655             :             {
     656             :                 // FitToSize not together with ContourFrame, for now
     657           0 :                 if (pTextObj->IsFitToSize())
     658           0 :                     aTextRect = aAnchorRect;
     659             :             }
     660             : 
     661           0 :             aTextEditArea = aTextRect;
     662             : 
     663             :             // Hack for calc, transform position of edit object according
     664             :             // to current zoom so as objects relative position to grid
     665             :             // appears stable
     666             : 
     667           0 :             Point aPvOfs(pTextObj->GetTextEditOffset());
     668           0 :             aTextEditArea += pTextObj->GetGridOffset();
     669           0 :             aTextEditArea.Move(aPvOfs.X(),aPvOfs.Y());
     670           0 :             aMinTextEditArea += pTextObj->GetGridOffset();
     671           0 :             aMinTextEditArea.Move(aPvOfs.X(),aPvOfs.Y());
     672           0 :             pTextEditCursorMerker=pWin->GetCursor();
     673             : 
     674           0 :             aHdl.SetMoveOutside(true);
     675             : 
     676             :             // #i72757#
     677             :             // Since IsMarkHdlWhenTextEdit() is ignored, it is necessary
     678             :             // to call AdjustMarkHdl() always.
     679           0 :             AdjustMarkHdl();
     680             : 
     681           0 :             pTextEditOutlinerView=ImpMakeOutlinerView(pWin,!bEmpty,pGivenOutlinerView);
     682             : 
     683             :             // check if this view is already inserted
     684           0 :             sal_uIntPtr i2,nCount = pTextEditOutliner->GetViewCount();
     685           0 :             for( i2 = 0; i2 < nCount; i2++ )
     686             :             {
     687           0 :                 if( pTextEditOutliner->GetView(i2) == pTextEditOutlinerView )
     688           0 :                     break;
     689             :             }
     690             : 
     691           0 :             if( i2 == nCount )
     692           0 :                 pTextEditOutliner->InsertView(pTextEditOutlinerView,0);
     693             : 
     694           0 :             aHdl.SetMoveOutside(false);
     695           0 :             aHdl.SetMoveOutside(true);
     696             : 
     697             :             // register all windows as OutlinerViews with the Outliner
     698           0 :             if(!bOnlyOneView)
     699             :             {
     700           0 :                 for(i = 0L; i < nWinAnz; i++)
     701             :                 {
     702           0 :                     SdrPaintWindow* pPaintWindow = GetPaintWindow(i);
     703           0 :                     OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
     704             : 
     705           0 :                     if(&rOutDev != pWin && OUTDEV_WINDOW == rOutDev.GetOutDevType())
     706             :                     {
     707           0 :                         OutlinerView* pOutlView = ImpMakeOutlinerView((Window*)(&rOutDev), !bEmpty, 0L);
     708           0 :                         pTextEditOutliner->InsertView(pOutlView, (sal_uInt16)i);
     709             :                     }
     710             :                 }
     711             :             }
     712             : 
     713           0 :             pTextEditOutlinerView->ShowCursor();
     714           0 :             pTextEditOutliner->SetStatusEventHdl(LINK(this,SdrObjEditView,ImpOutlinerStatusEventHdl));
     715             : #ifdef DBG_UTIL
     716             :             if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
     717             : #endif
     718           0 :             pTextEditOutliner->ClearModifyFlag();
     719             : 
     720           0 :             if (pTextObj->IsFitToSize())
     721             :             {
     722           0 :                 pWin->Invalidate(aTextEditArea);
     723             :             }
     724             : 
     725           0 :             if( GetModel() )
     726             :             {
     727           0 :                 SdrHint aHint(*pTextObj);
     728           0 :                 aHint.SetKind(HINT_BEGEDIT);
     729           0 :                 GetModel()->Broadcast(aHint);
     730             :             }
     731             : 
     732           0 :             pTextEditOutliner->setVisualizedPage(0);
     733             : 
     734           0 :             if( mxSelectionController.is() )
     735           0 :                 mxSelectionController->onSelectionHasChanged();
     736             : 
     737           0 :             if(IsUndoEnabled() && GetModel() && !GetModel()->GetDisableTextEditUsesCommonUndoManager())
     738             :             {
     739           0 :                 SdrUndoManager* pSdrUndoManager = getSdrUndoManagerForEnhancedTextEdit();
     740             : 
     741           0 :                 if(pSdrUndoManager)
     742             :                 {
     743             :                     // we have an outliner, undo manager and it's an EditUndoManager, exchange
     744             :                     // the document undo manager and the default one from the outliner and tell
     745             :                     // it that text edit starts by setting a callback if it needs to end text edit mode.
     746           0 :                     if(mpOldTextEditUndoManager)
     747             :                     {
     748             :                         // should not happen, delete it since it was probably forgotten somewhere
     749             :                         OSL_ENSURE(false, "Deleting forgotten old TextEditUndoManager, should be checked (!)");
     750           0 :                         delete mpOldTextEditUndoManager;
     751           0 :                         mpOldTextEditUndoManager = 0;
     752             :                     }
     753             : 
     754           0 :                     mpOldTextEditUndoManager = pTextEditOutliner->SetUndoManager(pSdrUndoManager);
     755           0 :                     pSdrUndoManager->SetEndTextEditHdl(LINK(this, SdrObjEditView, EndTextEditHdl));
     756             :                 }
     757             :                 else
     758             :                 {
     759             :                     OSL_ENSURE(false, "The document undo manager is not derived from SdrUndoManager (!)");
     760             :                 }
     761             :             }
     762             : 
     763           0 :             return true; // ran fine, let TextEdit run now
     764             :         }
     765             :         else
     766             :         {
     767           0 :             pTextEditOutliner->SetCalcFieldValueHdl(aOldCalcFieldValueLink);
     768           0 :             pTextEditOutliner->SetBeginPasteOrDropHdl(Link());
     769           0 :             pTextEditOutliner->SetEndPasteOrDropHdl(Link());
     770             :         }
     771             :     }
     772           0 :     if (pTextEditOutliner != NULL)
     773             :     {
     774           0 :         pTextEditOutliner->setVisualizedPage(0);
     775             :     }
     776             : 
     777             :     // something went wrong...
     778           0 :     if(!bDontDeleteOutliner)
     779             :     {
     780           0 :         if(pGivenOutliner!=NULL)
     781             :         {
     782           0 :             delete pGivenOutliner;
     783           0 :             pTextEditOutliner = NULL;
     784             :         }
     785           0 :         if(pGivenOutlinerView!=NULL)
     786             :         {
     787           0 :             delete pGivenOutlinerView;
     788           0 :             pGivenOutlinerView = NULL;
     789             :         }
     790             :     }
     791           0 :     if( pTextEditOutliner!=NULL )
     792             :     {
     793           0 :         delete pTextEditOutliner;
     794             :     }
     795             : 
     796           0 :     pTextEditOutliner=NULL;
     797           0 :     pTextEditOutlinerView=NULL;
     798           0 :     mxTextEditObj.reset(0);
     799           0 :     pTextEditPV=NULL;
     800           0 :     pTextEditWin=NULL;
     801           0 :     aHdl.SetMoveOutside(false);
     802             : 
     803           0 :     return false;
     804             : }
     805             : 
     806           0 : SdrEndTextEditKind SdrObjEditView::SdrEndTextEdit(bool bDontDeleteReally)
     807             : {
     808           0 :     SdrEndTextEditKind eRet=SDRENDTEXTEDIT_UNCHANGED;
     809           0 :     SdrTextObj* pTEObj = dynamic_cast< SdrTextObj* >( mxTextEditObj.get() );
     810           0 :     Window*       pTEWin         =pTextEditWin;
     811           0 :     SdrOutliner*  pTEOutliner    =pTextEditOutliner;
     812           0 :     OutlinerView* pTEOutlinerView=pTextEditOutlinerView;
     813           0 :     Cursor*       pTECursorMerker=pTextEditCursorMerker;
     814           0 :     SdrUndoManager* pUndoEditUndoManager = 0;
     815           0 :     bool bNeedToUndoSavedRedoTextEdit(false);
     816             : 
     817           0 :     if(IsUndoEnabled() && GetModel() && pTEObj && pTEOutliner && !GetModel()->GetDisableTextEditUsesCommonUndoManager())
     818             :     {
     819             :         // change back the UndoManager to the remembered original one
     820           0 :         ::svl::IUndoManager* pOriginal = pTEOutliner->SetUndoManager(mpOldTextEditUndoManager);
     821           0 :         mpOldTextEditUndoManager = 0;
     822             : 
     823           0 :         if(pOriginal)
     824             :         {
     825             :             // check if we got back our document undo manager
     826           0 :             SdrUndoManager* pSdrUndoManager = getSdrUndoManagerForEnhancedTextEdit();
     827             : 
     828           0 :             if(pSdrUndoManager && dynamic_cast< SdrUndoManager* >(pOriginal) == pSdrUndoManager)
     829             :             {
     830           0 :                 if(pSdrUndoManager->isEndTextEditTriggeredFromUndo())
     831             :                 {
     832             :                     // remember the UndoManager where missing Undos have to be triggered after end
     833             :                     // text edit. When the undo had triggered the end text edit, the original action
     834             :                     // which had to be undone originally is not yet undone.
     835           0 :                     pUndoEditUndoManager = pSdrUndoManager;
     836             : 
     837             :                     // We are ending text edit; if text edit was triggered from undo, execute all redos
     838             :                     // to create a complete text change undo action for the redo buffer. Also mark this
     839             :                     // state when at least one redo was executed; the created extra TextChange needs to
     840             :                     // be undone in addition to the first real undo outside the text edit changes
     841           0 :                     while(pSdrUndoManager->GetRedoActionCount())
     842             :                     {
     843           0 :                         bNeedToUndoSavedRedoTextEdit = true;
     844           0 :                         pSdrUndoManager->Redo();
     845             :                     }
     846             :                 }
     847             : 
     848             :                 // reset the callback link and let the undo manager cleanup all text edit
     849             :                 // undo actions to get the stack back to the form before the text edit
     850           0 :                 pSdrUndoManager->SetEndTextEditHdl(Link());
     851             :             }
     852             :             else
     853             :             {
     854             :                 OSL_ENSURE(false, "Got UndoManager back in SdrEndTextEdit which is NOT the expected document UndoManager (!)");
     855           0 :                 delete pOriginal;
     856             :             }
     857             :         }
     858             :     }
     859             : 
     860           0 :     if( GetModel() && mxTextEditObj.is() )
     861             :     {
     862           0 :         SdrHint aHint(*mxTextEditObj.get());
     863           0 :         aHint.SetKind(HINT_ENDEDIT);
     864           0 :         GetModel()->Broadcast(aHint);
     865             :     }
     866             : 
     867           0 :     mxTextEditObj.reset(0);
     868           0 :     pTextEditPV=NULL;
     869           0 :     pTextEditWin=NULL;
     870           0 :     pTextEditOutliner=NULL;
     871           0 :     pTextEditOutlinerView=NULL;
     872           0 :     pTextEditCursorMerker=NULL;
     873           0 :     aTextEditArea=Rectangle();
     874             : 
     875           0 :     if (pTEOutliner!=NULL)
     876             :     {
     877           0 :         bool bModified=pTEOutliner->IsModified();
     878           0 :         if (pTEOutlinerView!=NULL)
     879             :         {
     880           0 :             pTEOutlinerView->HideCursor();
     881             :         }
     882           0 :         if (pTEObj!=NULL)
     883             :         {
     884           0 :             pTEOutliner->CompleteOnlineSpelling();
     885             : 
     886           0 :             SdrUndoObjSetText* pTxtUndo = 0;
     887             : 
     888           0 :             if( bModified )
     889             :             {
     890             :                 sal_Int32 nText;
     891           0 :                 for( nText = 0; nText < pTEObj->getTextCount(); ++nText )
     892           0 :                     if( pTEObj->getText( nText ) == pTEObj->getActiveText() )
     893           0 :                         break;
     894             : 
     895           0 :                 pTxtUndo = dynamic_cast< SdrUndoObjSetText* >( GetModel()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTEObj, nText ) );
     896             :             }
     897             :             DBG_ASSERT( !bModified || pTxtUndo, "svx::SdrObjEditView::EndTextEdit(), could not create undo action!" );
     898             :             // Set old CalcFieldValue-Handler again, this
     899             :             // has to happen before Obj::EndTextEdit(), as this does UpdateFields().
     900           0 :             pTEOutliner->SetCalcFieldValueHdl(aOldCalcFieldValueLink);
     901           0 :             pTEOutliner->SetBeginPasteOrDropHdl(Link());
     902           0 :             pTEOutliner->SetEndPasteOrDropHdl(Link());
     903             : 
     904           0 :             const bool bUndo = IsUndoEnabled();
     905           0 :             if( bUndo )
     906             :             {
     907           0 :                 OUString aObjName(pTEObj->TakeObjNameSingul());
     908           0 :                 BegUndo(ImpGetResStr(STR_UndoObjSetText),aObjName);
     909             :             }
     910             : 
     911           0 :             pTEObj->EndTextEdit(*pTEOutliner);
     912             : 
     913           0 :             if( (pTEObj->GetRotateAngle() != 0) || (pTEObj && pTEObj->ISA(SdrTextObj) && ((SdrTextObj*)pTEObj)->IsFontwork())  )
     914             :             {
     915           0 :                 pTEObj->ActionChanged();
     916             :             }
     917             : 
     918           0 :             if (pTxtUndo!=NULL)
     919             :             {
     920           0 :                 pTxtUndo->AfterSetText();
     921           0 :                 if (!pTxtUndo->IsDifferent())
     922             :                 {
     923           0 :                     delete pTxtUndo;
     924           0 :                     pTxtUndo=NULL;
     925             :                 }
     926             :             }
     927             :             // check deletion of entire TextObj
     928           0 :             SdrUndoAction* pDelUndo=NULL;
     929           0 :             bool bDelObj=false;
     930           0 :             SdrTextObj* pTextObj=PTR_CAST(SdrTextObj,pTEObj);
     931           0 :             if (pTextObj!=NULL && bTextEditNewObj)
     932             :             {
     933           0 :                 bDelObj=pTextObj->IsTextFrame() &&
     934           0 :                         !pTextObj->HasText() &&
     935           0 :                         !pTextObj->IsEmptyPresObj() &&
     936           0 :                         !pTextObj->HasFill() &&
     937           0 :                         !pTextObj->HasLine();
     938             : 
     939           0 :                 if(pTEObj->IsInserted() && bDelObj && pTextObj->GetObjInventor()==SdrInventor && !bDontDeleteReally)
     940             :                 {
     941           0 :                     SdrObjKind eIdent=(SdrObjKind)pTextObj->GetObjIdentifier();
     942           0 :                     if(eIdent==OBJ_TEXT || eIdent==OBJ_TEXTEXT)
     943             :                     {
     944           0 :                         pDelUndo= GetModel()->GetSdrUndoFactory().CreateUndoDeleteObject(*pTEObj);
     945             :                     }
     946             :                 }
     947             :             }
     948           0 :             if (pTxtUndo!=NULL)
     949             :             {
     950           0 :                 if( bUndo )
     951           0 :                     AddUndo(pTxtUndo);
     952           0 :                 eRet=SDRENDTEXTEDIT_CHANGED;
     953             :             }
     954           0 :             if (pDelUndo!=NULL)
     955             :             {
     956           0 :                 if( bUndo )
     957             :                 {
     958           0 :                     AddUndo(pDelUndo);
     959             :                 }
     960             :                 else
     961             :                 {
     962           0 :                     delete pDelUndo;
     963             :                 }
     964           0 :                 eRet=SDRENDTEXTEDIT_DELETED;
     965             :                 DBG_ASSERT(pTEObj->GetObjList()!=NULL,"SdrObjEditView::SdrEndTextEdit(): Fatal: Object edited doesn't have an ObjList!");
     966           0 :                 if (pTEObj->GetObjList()!=NULL)
     967             :                 {
     968           0 :                     pTEObj->GetObjList()->RemoveObject(pTEObj->GetOrdNum());
     969           0 :                     CheckMarked(); // remove selection immediately...
     970             :                 }
     971             :             }
     972           0 :             else if (bDelObj)
     973             :             { // for Writer: the app has to do the deletion itself.
     974           0 :                 eRet=SDRENDTEXTEDIT_SHOULDBEDELETED;
     975             :             }
     976             : 
     977           0 :             if( bUndo )
     978           0 :                 EndUndo(); // EndUndo after Remove, in case UndoStack is deleted immediately
     979             : 
     980             :             // Switch on any TextAnimation again after TextEdit
     981           0 :             if(pTEObj->ISA(SdrTextObj))
     982             :             {
     983           0 :                 ((SdrTextObj*)pTEObj)->SetTextAnimationAllowed(true);
     984             :             }
     985             : 
     986             :             // #i72757#
     987             :             // Since IsMarkHdlWhenTextEdit() is ignored, it is necessary
     988             :             // to call AdjustMarkHdl() always.
     989           0 :             AdjustMarkHdl();
     990             :         }
     991             :         // delete all OutlinerViews
     992           0 :         for (sal_uIntPtr i=pTEOutliner->GetViewCount(); i>0;)
     993             :         {
     994           0 :             i--;
     995           0 :             OutlinerView* pOLV=pTEOutliner->GetView(i);
     996           0 :             sal_uInt16 nMorePix=pOLV->GetInvalidateMore() + 10;
     997           0 :             Window* pWin=pOLV->GetWindow();
     998           0 :             Rectangle aRect(pOLV->GetOutputArea());
     999           0 :             pTEOutliner->RemoveView(i);
    1000           0 :             if (!bTextEditDontDelete || i!=0)
    1001             :             {
    1002             :                 // may not own the zeroth one
    1003           0 :                 delete pOLV;
    1004             :             }
    1005           0 :             aRect.Union(aTextEditArea);
    1006           0 :             aRect.Union(aMinTextEditArea);
    1007           0 :             aRect=pWin->LogicToPixel(aRect);
    1008           0 :             aRect.Left()-=nMorePix;
    1009           0 :             aRect.Top()-=nMorePix;
    1010           0 :             aRect.Right()+=nMorePix;
    1011           0 :             aRect.Bottom()+=nMorePix;
    1012           0 :             aRect=pWin->PixelToLogic(aRect);
    1013           0 :             InvalidateOneWin(*pWin,aRect);
    1014           0 :             pWin->SetFillColor();
    1015           0 :             pWin->SetLineColor(COL_BLACK);
    1016           0 :             pWin->DrawPixel(aRect.TopLeft());
    1017           0 :             pWin->DrawPixel(aRect.TopRight());
    1018           0 :             pWin->DrawPixel(aRect.BottomLeft());
    1019           0 :             pWin->DrawPixel(aRect.BottomRight());
    1020             :         }
    1021             :         // and now the Outliner itself
    1022           0 :         if (!bTextEditDontDelete) delete pTEOutliner;
    1023           0 :         else pTEOutliner->Clear();
    1024           0 :         if (pTEWin!=NULL) {
    1025           0 :             pTEWin->SetCursor(pTECursorMerker);
    1026             :         }
    1027           0 :         aHdl.SetMoveOutside(false);
    1028           0 :         if (eRet!=SDRENDTEXTEDIT_UNCHANGED)
    1029             :         {
    1030           0 :             GetMarkedObjectListWriteAccess().SetNameDirty();
    1031             :         }
    1032             : #ifdef DBG_UTIL
    1033             :         if (pItemBrowser)
    1034             :         {
    1035             :             GetMarkedObjectListWriteAccess().SetNameDirty();
    1036             :             pItemBrowser->SetDirty();
    1037             :         }
    1038             : #endif
    1039             :     }
    1040             : 
    1041           0 :     if( pTEObj &&
    1042           0 :         pTEObj->GetModel() &&
    1043           0 :         !pTEObj->GetModel()->isLocked() &&
    1044           0 :         pTEObj->GetBroadcaster())
    1045             :     {
    1046           0 :         SdrHint aHint(HINT_ENDEDIT);
    1047           0 :         aHint.SetObject(pTEObj);
    1048           0 :         ((SfxBroadcaster*)pTEObj->GetBroadcaster())->Broadcast(aHint);
    1049             :     }
    1050             : 
    1051           0 :     if(pUndoEditUndoManager)
    1052             :     {
    1053           0 :         if(bNeedToUndoSavedRedoTextEdit)
    1054             :         {
    1055             :             // undo the text edit action since it was created as part of an EndTextEdit
    1056             :             // callback from undo itself. This needs to be done after the call to
    1057             :             // FmFormView::SdrEndTextEdit since it gets created there
    1058           0 :             pUndoEditUndoManager->Undo();
    1059             :         }
    1060             : 
    1061             :         // trigger the Undo which was not executed, but lead to this
    1062             :         // end text edit
    1063           0 :         pUndoEditUndoManager->Undo();
    1064             :     }
    1065             : 
    1066           0 :     return eRet;
    1067             : }
    1068             : 
    1069             : 
    1070             : // info about TextEdit. Default is false.
    1071           0 : bool SdrObjEditView::IsTextEdit() const
    1072             : {
    1073           0 :     return mxTextEditObj.is();
    1074             : }
    1075             : 
    1076             : // info about TextEditPageView. Default is 0L.
    1077           0 : SdrPageView* SdrObjEditView::GetTextEditPageView() const
    1078             : {
    1079           0 :     return pTextEditPV;
    1080             : }
    1081             : 
    1082             : 
    1083             : 
    1084           0 : OutlinerView* SdrObjEditView::ImpFindOutlinerView(Window* pWin) const
    1085             : {
    1086           0 :     if (pWin==NULL) return NULL;
    1087           0 :     if (pTextEditOutliner==NULL) return NULL;
    1088           0 :     OutlinerView* pNewView=NULL;
    1089           0 :     sal_uIntPtr nWinAnz=pTextEditOutliner->GetViewCount();
    1090           0 :     for (sal_uIntPtr i=0; i<nWinAnz && pNewView==NULL; i++) {
    1091           0 :         OutlinerView* pView=pTextEditOutliner->GetView(i);
    1092           0 :         if (pView->GetWindow()==pWin) pNewView=pView;
    1093             :     }
    1094           0 :     return pNewView;
    1095             : }
    1096             : 
    1097           0 : void SdrObjEditView::SetTextEditWin(Window* pWin)
    1098             : {
    1099           0 :     if(mxTextEditObj.is() && pWin!=NULL && pWin!=pTextEditWin)
    1100             :     {
    1101           0 :         OutlinerView* pNewView=ImpFindOutlinerView(pWin);
    1102           0 :         if (pNewView!=NULL && pNewView!=pTextEditOutlinerView)
    1103             :         {
    1104           0 :             if (pTextEditOutlinerView!=NULL)
    1105             :             {
    1106           0 :                 pTextEditOutlinerView->HideCursor();
    1107             :             }
    1108           0 :             pTextEditOutlinerView=pNewView;
    1109           0 :             pTextEditWin=pWin;
    1110           0 :             pWin->GrabFocus(); // Make the cursor blink here as well
    1111           0 :             pNewView->ShowCursor();
    1112           0 :             ImpMakeTextCursorAreaVisible();
    1113             :         }
    1114             :     }
    1115           0 : }
    1116             : 
    1117           0 : bool SdrObjEditView::IsTextEditHit(const Point& rHit, short nTol) const
    1118             : {
    1119           0 :     bool bOk=false;
    1120           0 :     if(mxTextEditObj.is())
    1121             :     {
    1122           0 :         nTol=ImpGetHitTolLogic(nTol,NULL);
    1123             :         // only a third of the tolerance here, so handles can be hit well
    1124           0 :         nTol=nTol/3;
    1125           0 :         nTol=0; // no hit tolerance here any more
    1126             : 
    1127           0 :         Rectangle aEditArea;
    1128           0 :         OutlinerView* pOLV=pTextEditOutliner->GetView(0);
    1129           0 :         if (pOLV!=NULL)
    1130             :         {
    1131           0 :             aEditArea.Union(pOLV->GetOutputArea());
    1132             :         }
    1133           0 :         aEditArea.Left()-=nTol;
    1134           0 :         aEditArea.Top()-=nTol;
    1135           0 :         aEditArea.Right()+=nTol;
    1136           0 :         aEditArea.Bottom()+=nTol;
    1137           0 :         bOk=aEditArea.IsInside(rHit);
    1138           0 :         if (bOk)
    1139             :         { // check if any characters were actually hit
    1140           0 :             Point aPnt(rHit); aPnt-=aEditArea.TopLeft();
    1141           0 :             long nHitTol = 2000;
    1142           0 :             OutputDevice* pRef = pTextEditOutliner->GetRefDevice();
    1143           0 :             if( pRef )
    1144           0 :                 nHitTol = pRef->LogicToLogic( nHitTol, MAP_100TH_MM, pRef->GetMapMode().GetMapUnit() );
    1145             : 
    1146           0 :             bOk = pTextEditOutliner->IsTextPos( aPnt, (sal_uInt16)nHitTol );
    1147             :         }
    1148             :     }
    1149           0 :     return bOk;
    1150             : }
    1151             : 
    1152           0 : bool SdrObjEditView::IsTextEditFrameHit(const Point& rHit) const
    1153             : {
    1154           0 :     bool bOk=false;
    1155           0 :     if(mxTextEditObj.is())
    1156             :     {
    1157           0 :         SdrTextObj* pText= dynamic_cast<SdrTextObj*>(mxTextEditObj.get());
    1158           0 :         OutlinerView* pOLV=pTextEditOutliner->GetView(0);
    1159           0 :         if( pOLV )
    1160             :         {
    1161           0 :             Window* pWin=pOLV->GetWindow();
    1162           0 :             if (pText!=NULL && pText->IsTextFrame() && pOLV!=NULL && pWin!=NULL) {
    1163           0 :                 sal_uInt16 nPixSiz=pOLV->GetInvalidateMore();
    1164           0 :                 Rectangle aEditArea(aMinTextEditArea);
    1165           0 :                 aEditArea.Union(pOLV->GetOutputArea());
    1166           0 :                 if (!aEditArea.IsInside(rHit)) {
    1167           0 :                     Size aSiz(pWin->PixelToLogic(Size(nPixSiz,nPixSiz)));
    1168           0 :                     aEditArea.Left()-=aSiz.Width();
    1169           0 :                     aEditArea.Top()-=aSiz.Height();
    1170           0 :                     aEditArea.Right()+=aSiz.Width();
    1171           0 :                     aEditArea.Bottom()+=aSiz.Height();
    1172           0 :                     bOk=aEditArea.IsInside(rHit);
    1173             :                 }
    1174             :             }
    1175             :         }
    1176             :     }
    1177           0 :     return bOk;
    1178             : }
    1179             : 
    1180             : 
    1181             : 
    1182           0 : bool SdrObjEditView::KeyInput(const KeyEvent& rKEvt, Window* pWin)
    1183             : {
    1184           0 :     if(pTextEditOutlinerView)
    1185             :     {
    1186           0 :         if (pTextEditOutlinerView->PostKeyEvent(rKEvt, pWin))
    1187             :         {
    1188           0 :             if( pMod )
    1189             :             {
    1190           0 :                 if( pTextEditOutliner && pTextEditOutliner->IsModified() )
    1191           0 :                     pMod->SetChanged( true );
    1192             :             }
    1193             : 
    1194           0 :             if (pWin!=NULL && pWin!=pTextEditWin) SetTextEditWin(pWin);
    1195             : #ifdef DBG_UTIL
    1196             :             if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
    1197             : #endif
    1198           0 :             ImpMakeTextCursorAreaVisible();
    1199           0 :             return true;
    1200             :         }
    1201             :     }
    1202           0 :     return SdrGlueEditView::KeyInput(rKEvt,pWin);
    1203             : }
    1204             : 
    1205           0 : bool SdrObjEditView::MouseButtonDown(const MouseEvent& rMEvt, Window* pWin)
    1206             : {
    1207           0 :     if (pTextEditOutlinerView!=NULL) {
    1208           0 :         bool bPostIt=pTextEditOutliner->IsInSelectionMode();
    1209           0 :         if (!bPostIt) {
    1210           0 :             Point aPt(rMEvt.GetPosPixel());
    1211           0 :             if (pWin!=NULL) aPt=pWin->PixelToLogic(aPt);
    1212           0 :             else if (pTextEditWin!=NULL) aPt=pTextEditWin->PixelToLogic(aPt);
    1213           0 :             bPostIt=IsTextEditHit(aPt,nHitTolLog);
    1214             :         }
    1215           0 :         if (bPostIt) {
    1216           0 :             Point aPixPos(rMEvt.GetPosPixel());
    1217           0 :             if (pWin)
    1218             :             {
    1219           0 :                 Rectangle aR(pWin->LogicToPixel(pTextEditOutlinerView->GetOutputArea()));
    1220           0 :                 if (aPixPos.X()<aR.Left  ()) aPixPos.X()=aR.Left  ();
    1221           0 :                 if (aPixPos.X()>aR.Right ()) aPixPos.X()=aR.Right ();
    1222           0 :                 if (aPixPos.Y()<aR.Top   ()) aPixPos.Y()=aR.Top   ();
    1223           0 :                 if (aPixPos.Y()>aR.Bottom()) aPixPos.Y()=aR.Bottom();
    1224             :             }
    1225           0 :             MouseEvent aMEvt(aPixPos,rMEvt.GetClicks(),rMEvt.GetMode(),
    1226           0 :                              rMEvt.GetButtons(),rMEvt.GetModifier());
    1227           0 :             if (pTextEditOutlinerView->MouseButtonDown(aMEvt)) {
    1228           0 :                 if (pWin!=NULL && pWin!=pTextEditWin) SetTextEditWin(pWin);
    1229             : #ifdef DBG_UTIL
    1230             :                 if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
    1231             : #endif
    1232           0 :                 ImpMakeTextCursorAreaVisible();
    1233           0 :                 return true;
    1234             :             }
    1235             :         }
    1236             :     }
    1237           0 :     return SdrGlueEditView::MouseButtonDown(rMEvt,pWin);
    1238             : }
    1239             : 
    1240           0 : bool SdrObjEditView::MouseButtonUp(const MouseEvent& rMEvt, Window* pWin)
    1241             : {
    1242           0 :     if (pTextEditOutlinerView!=NULL) {
    1243           0 :         bool bPostIt=pTextEditOutliner->IsInSelectionMode();
    1244           0 :         if (!bPostIt) {
    1245           0 :             Point aPt(rMEvt.GetPosPixel());
    1246           0 :             if (pWin!=NULL) aPt=pWin->PixelToLogic(aPt);
    1247           0 :             else if (pTextEditWin!=NULL) aPt=pTextEditWin->PixelToLogic(aPt);
    1248           0 :             bPostIt=IsTextEditHit(aPt,nHitTolLog);
    1249             :         }
    1250           0 :         if (bPostIt) {
    1251           0 :             Point aPixPos(rMEvt.GetPosPixel());
    1252           0 :             Rectangle aR(pWin->LogicToPixel(pTextEditOutlinerView->GetOutputArea()));
    1253           0 :             if (aPixPos.X()<aR.Left  ()) aPixPos.X()=aR.Left  ();
    1254           0 :             if (aPixPos.X()>aR.Right ()) aPixPos.X()=aR.Right ();
    1255           0 :             if (aPixPos.Y()<aR.Top   ()) aPixPos.Y()=aR.Top   ();
    1256           0 :             if (aPixPos.Y()>aR.Bottom()) aPixPos.Y()=aR.Bottom();
    1257           0 :             MouseEvent aMEvt(aPixPos,rMEvt.GetClicks(),rMEvt.GetMode(),
    1258           0 :                              rMEvt.GetButtons(),rMEvt.GetModifier());
    1259           0 :             if (pTextEditOutlinerView->MouseButtonUp(aMEvt)) {
    1260             : #ifdef DBG_UTIL
    1261             :                 if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
    1262             : #endif
    1263           0 :                 ImpMakeTextCursorAreaVisible();
    1264           0 :                 return true;
    1265             :             }
    1266             :         }
    1267             :     }
    1268           0 :     return SdrGlueEditView::MouseButtonUp(rMEvt,pWin);
    1269             : }
    1270             : 
    1271           0 : bool SdrObjEditView::MouseMove(const MouseEvent& rMEvt, Window* pWin)
    1272             : {
    1273           0 :     if (pTextEditOutlinerView!=NULL) {
    1274           0 :         bool bSelMode=pTextEditOutliner->IsInSelectionMode();
    1275           0 :         bool bPostIt=bSelMode;
    1276           0 :         if (!bPostIt) {
    1277           0 :             Point aPt(rMEvt.GetPosPixel());
    1278           0 :             if (pWin!=NULL) aPt=pWin->PixelToLogic(aPt);
    1279           0 :             else if (pTextEditWin!=NULL) aPt=pTextEditWin->PixelToLogic(aPt);
    1280           0 :             bPostIt=IsTextEditHit(aPt,nHitTolLog);
    1281             :         }
    1282           0 :         if (bPostIt) {
    1283           0 :             Point aPixPos(rMEvt.GetPosPixel());
    1284           0 :             Rectangle aR(pWin->LogicToPixel(pTextEditOutlinerView->GetOutputArea()));
    1285           0 :             if (aPixPos.X()<aR.Left  ()) aPixPos.X()=aR.Left  ();
    1286           0 :             if (aPixPos.X()>aR.Right ()) aPixPos.X()=aR.Right ();
    1287           0 :             if (aPixPos.Y()<aR.Top   ()) aPixPos.Y()=aR.Top   ();
    1288           0 :             if (aPixPos.Y()>aR.Bottom()) aPixPos.Y()=aR.Bottom();
    1289           0 :             MouseEvent aMEvt(aPixPos,rMEvt.GetClicks(),rMEvt.GetMode(),
    1290           0 :                              rMEvt.GetButtons(),rMEvt.GetModifier());
    1291           0 :             if (pTextEditOutlinerView->MouseMove(aMEvt) && bSelMode) {
    1292             : #ifdef DBG_UTIL
    1293             :                 if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
    1294             : #endif
    1295           0 :                 ImpMakeTextCursorAreaVisible();
    1296           0 :                 return true;
    1297             :             }
    1298             :         }
    1299             :     }
    1300           0 :     return SdrGlueEditView::MouseMove(rMEvt,pWin);
    1301             : }
    1302             : 
    1303           0 : bool SdrObjEditView::Command(const CommandEvent& rCEvt, Window* pWin)
    1304             : {
    1305             :     // as long as OutlinerView returns a sal_Bool, it only gets COMMAND_STARTDRAG
    1306           0 :     if (pTextEditOutlinerView!=NULL)
    1307             :     {
    1308           0 :         if (rCEvt.GetCommand()==COMMAND_STARTDRAG) {
    1309           0 :             bool bPostIt=pTextEditOutliner->IsInSelectionMode() || !rCEvt.IsMouseEvent();
    1310           0 :             if (!bPostIt && rCEvt.IsMouseEvent()) {
    1311           0 :                 Point aPt(rCEvt.GetMousePosPixel());
    1312           0 :                 if (pWin!=NULL) aPt=pWin->PixelToLogic(aPt);
    1313           0 :                 else if (pTextEditWin!=NULL) aPt=pTextEditWin->PixelToLogic(aPt);
    1314           0 :                 bPostIt=IsTextEditHit(aPt,nHitTolLog);
    1315             :             }
    1316           0 :             if (bPostIt) {
    1317           0 :                 Point aPixPos(rCEvt.GetMousePosPixel());
    1318           0 :                 if (rCEvt.IsMouseEvent()) {
    1319           0 :                     Rectangle aR(pWin->LogicToPixel(pTextEditOutlinerView->GetOutputArea()));
    1320           0 :                     if (aPixPos.X()<aR.Left  ()) aPixPos.X()=aR.Left  ();
    1321           0 :                     if (aPixPos.X()>aR.Right ()) aPixPos.X()=aR.Right ();
    1322           0 :                     if (aPixPos.Y()<aR.Top   ()) aPixPos.Y()=aR.Top   ();
    1323           0 :                     if (aPixPos.Y()>aR.Bottom()) aPixPos.Y()=aR.Bottom();
    1324             :                 }
    1325           0 :                 CommandEvent aCEvt(aPixPos,rCEvt.GetCommand(),rCEvt.IsMouseEvent());
    1326             :                 // Command is void at the OutlinerView, sadly
    1327           0 :                 pTextEditOutlinerView->Command(aCEvt);
    1328           0 :                 if (pWin!=NULL && pWin!=pTextEditWin) SetTextEditWin(pWin);
    1329             : #ifdef DBG_UTIL
    1330             :                 if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
    1331             : #endif
    1332           0 :                 ImpMakeTextCursorAreaVisible();
    1333           0 :                 return true;
    1334             :             }
    1335             :         }
    1336             :         else
    1337             :         {
    1338           0 :             pTextEditOutlinerView->Command(rCEvt);
    1339           0 :             return true;
    1340             :         }
    1341             :     }
    1342           0 :     return SdrGlueEditView::Command(rCEvt,pWin);
    1343             : }
    1344             : 
    1345             : 
    1346             : 
    1347           0 : bool SdrObjEditView::ImpIsTextEditAllSelected() const
    1348             : {
    1349           0 :     bool bRet=false;
    1350           0 :     if (pTextEditOutliner!=NULL && pTextEditOutlinerView!=NULL)
    1351             :     {
    1352           0 :         if(SdrTextObj::HasTextImpl( pTextEditOutliner ) )
    1353             :         {
    1354           0 :             const sal_Int32 nParaAnz=pTextEditOutliner->GetParagraphCount();
    1355           0 :             Paragraph* pLastPara=pTextEditOutliner->GetParagraph( nParaAnz > 1 ? nParaAnz - 1 : 0 );
    1356             : 
    1357           0 :             ESelection aESel(pTextEditOutlinerView->GetSelection());
    1358           0 :             if (aESel.nStartPara==0 && aESel.nStartPos==0 && aESel.nEndPara==(nParaAnz-1))
    1359             :             {
    1360           0 :                 if( pTextEditOutliner->GetText(pLastPara).getLength() == aESel.nEndPos )
    1361           0 :                     bRet = true;
    1362             :             }
    1363             :             // in case the selection was done backwards
    1364           0 :             if (!bRet && aESel.nEndPara==0 && aESel.nEndPos==0 && aESel.nStartPara==(nParaAnz-1))
    1365             :             {
    1366           0 :                 if(pTextEditOutliner->GetText(pLastPara).getLength() == aESel.nStartPos)
    1367           0 :                     bRet = true;
    1368             :             }
    1369             :         }
    1370             :         else
    1371             :         {
    1372           0 :             bRet=true;
    1373             :         }
    1374             :     }
    1375           0 :     return bRet;
    1376             : }
    1377             : 
    1378           0 : void SdrObjEditView::ImpMakeTextCursorAreaVisible()
    1379             : {
    1380           0 :     if (pTextEditOutlinerView!=NULL && pTextEditWin!=NULL) {
    1381           0 :         Cursor* pCsr=pTextEditWin->GetCursor();
    1382           0 :         if (pCsr!=NULL) {
    1383           0 :             Size aSiz(pCsr->GetSize());
    1384           0 :             if (aSiz.Width()!=0 && aSiz.Height()!=0) {
    1385           0 :                 MakeVisible(Rectangle(pCsr->GetPos(),aSiz),*pTextEditWin);
    1386             :             }
    1387             :         }
    1388             :     }
    1389           0 : }
    1390             : 
    1391           0 : sal_uInt16 SdrObjEditView::GetScriptType() const
    1392             : {
    1393           0 :     sal_uInt16 nScriptType = 0;
    1394             : 
    1395           0 :     if( IsTextEdit() )
    1396             :     {
    1397           0 :         if( mxTextEditObj->GetOutlinerParaObject() )
    1398           0 :             nScriptType = mxTextEditObj->GetOutlinerParaObject()->GetTextObject().GetScriptType();
    1399             : 
    1400           0 :         if( pTextEditOutlinerView )
    1401           0 :             nScriptType = pTextEditOutlinerView->GetSelectedScriptType();
    1402             :     }
    1403             :     else
    1404             :     {
    1405           0 :         sal_uInt32 nMarkCount( GetMarkedObjectCount() );
    1406             : 
    1407           0 :         for( sal_uInt32 i = 0; i < nMarkCount; i++ )
    1408             :         {
    1409           0 :             OutlinerParaObject* pParaObj = GetMarkedObjectByIndex( i )->GetOutlinerParaObject();
    1410             : 
    1411           0 :             if( pParaObj )
    1412             :             {
    1413           0 :                 nScriptType |= pParaObj->GetTextObject().GetScriptType();
    1414             :             }
    1415             :         }
    1416             :     }
    1417             : 
    1418           0 :     if( nScriptType == 0 )
    1419           0 :         nScriptType = SCRIPTTYPE_LATIN;
    1420             : 
    1421           0 :     return nScriptType;
    1422             : }
    1423             : 
    1424           0 : bool SdrObjEditView::GetAttributes(SfxItemSet& rTargetSet, bool bOnlyHardAttr) const
    1425             : {
    1426           0 :     if( mxSelectionController.is() )
    1427           0 :         if( mxSelectionController->GetAttributes( rTargetSet, bOnlyHardAttr ) )
    1428           0 :             return true;
    1429             : 
    1430           0 :     if(IsTextEdit())
    1431             :     {
    1432             :         DBG_ASSERT(pTextEditOutlinerView!=NULL,"SdrObjEditView::GetAttributes(): pTextEditOutlinerView=NULL");
    1433             :         DBG_ASSERT(pTextEditOutliner!=NULL,"SdrObjEditView::GetAttributes(): pTextEditOutliner=NULL");
    1434             : 
    1435             :         // take care of bOnlyHardAttr(!)
    1436           0 :         if(!bOnlyHardAttr && mxTextEditObj->GetStyleSheet())
    1437           0 :             rTargetSet.Put(mxTextEditObj->GetStyleSheet()->GetItemSet());
    1438             : 
    1439             :         // add object attributes
    1440           0 :         rTargetSet.Put( mxTextEditObj->GetMergedItemSet() );
    1441             : 
    1442           0 :         if( mxTextEditObj->GetOutlinerParaObject() )
    1443           0 :             rTargetSet.Put( SvxScriptTypeItem( mxTextEditObj->GetOutlinerParaObject()->GetTextObject().GetScriptType() ) );
    1444             : 
    1445           0 :         if(pTextEditOutlinerView)
    1446             :         {
    1447             :             // FALSE= regard InvalidItems as "holes," not as Default
    1448           0 :             rTargetSet.Put(pTextEditOutlinerView->GetAttribs(), false);
    1449           0 :             rTargetSet.Put( SvxScriptTypeItem( pTextEditOutlinerView->GetSelectedScriptType() ) );
    1450             :         }
    1451             : 
    1452           0 :         if(GetMarkedObjectCount()==1 && GetMarkedObjectByIndex(0)==mxTextEditObj.get())
    1453             :         {
    1454           0 :             MergeNotPersistAttrFromMarked(rTargetSet, bOnlyHardAttr);
    1455             :         }
    1456             : 
    1457           0 :         return true;
    1458             :     }
    1459             :     else
    1460             :     {
    1461           0 :         return SdrGlueEditView::GetAttributes(rTargetSet, bOnlyHardAttr);
    1462             :     }
    1463             : }
    1464             : 
    1465           0 : bool SdrObjEditView::SetAttributes(const SfxItemSet& rSet, bool bReplaceAll)
    1466             : {
    1467           0 :     bool bRet=false;
    1468           0 :     bool bTextEdit=pTextEditOutlinerView!=NULL && mxTextEditObj.is();
    1469           0 :     bool bAllTextSelected=ImpIsTextEditAllSelected();
    1470           0 :     const SfxItemSet* pSet=&rSet;
    1471             : 
    1472           0 :     if (!bTextEdit)
    1473             :     {
    1474             :         // no TextEdit activw -> all Items to drawing object
    1475           0 :         if( mxSelectionController.is() )
    1476           0 :             bRet=mxSelectionController->SetAttributes(*pSet,bReplaceAll );
    1477             : 
    1478           0 :         if( !bRet )
    1479             :         {
    1480           0 :             bRet=SdrGlueEditView::SetAttributes(*pSet,bReplaceAll);
    1481             :         }
    1482             :     }
    1483             :     else
    1484             :     {
    1485             : #ifdef DBG_UTIL
    1486             :         {
    1487             :             bool bHasEEFeatureItems=false;
    1488             :             SfxItemIter aIter(rSet);
    1489             :             const SfxPoolItem* pItem=aIter.FirstItem();
    1490             :             while (!bHasEEFeatureItems && pItem!=NULL)
    1491             :             {
    1492             :                 if (!IsInvalidItem(pItem))
    1493             :                 {
    1494             :                     sal_uInt16 nW=pItem->Which();
    1495             :                     if (nW>=EE_FEATURE_START && nW<=EE_FEATURE_END)
    1496             :                         bHasEEFeatureItems=true;
    1497             :                 }
    1498             : 
    1499             :                 pItem=aIter.NextItem();
    1500             :             }
    1501             : 
    1502             :             if(bHasEEFeatureItems)
    1503             :             {
    1504             :                 OUString aMessage("SdrObjEditView::SetAttributes(): Setting EE_FEATURE items at the SdrView does not make sense! It only leads to overhead and unreadable documents.");
    1505             :                 InfoBox(NULL, aMessage).Execute();
    1506             :             }
    1507             :         }
    1508             : #endif
    1509             : 
    1510             :         bool bOnlyEEItems;
    1511           0 :         bool bNoEEItems=!SearchOutlinerItems(*pSet,bReplaceAll,&bOnlyEEItems);
    1512             :         // everything selected? -> attributes to the border, too
    1513             :         // if no EEItems, attributes to the border only
    1514           0 :         if (bAllTextSelected || bNoEEItems)
    1515             :         {
    1516           0 :             if( mxSelectionController.is() )
    1517           0 :                 bRet=mxSelectionController->SetAttributes(*pSet,bReplaceAll );
    1518             : 
    1519           0 :             if( !bRet )
    1520             :             {
    1521           0 :                 const bool bUndo = IsUndoEnabled();
    1522             : 
    1523           0 :                 if( bUndo )
    1524             :                 {
    1525           0 :                     OUString aStr;
    1526           0 :                     ImpTakeDescriptionStr(STR_EditSetAttributes,aStr);
    1527           0 :                     BegUndo(aStr);
    1528           0 :                     AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*mxTextEditObj.get()));
    1529             : 
    1530             :                     // #i43537#
    1531             :                     // If this is a text object also rescue the OutlinerParaObject since
    1532             :                     // applying attributes to the object may change text layout when
    1533             :                     // multiple portions exist with multiple formats. If a OutlinerParaObject
    1534             :                     // really exists and needs to be rescued is evaluated in the undo
    1535             :                     // implementation itself.
    1536           0 :                     bool bRescueText = dynamic_cast< SdrTextObj* >(mxTextEditObj.get());
    1537             : 
    1538           0 :                     AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoAttrObject(*mxTextEditObj.get(),false,!bNoEEItems || bRescueText));
    1539           0 :                     EndUndo();
    1540             :                 }
    1541             : 
    1542           0 :                 mxTextEditObj->SetMergedItemSetAndBroadcast(*pSet, bReplaceAll);
    1543             : 
    1544           0 :                 FlushComeBackTimer(); // to set ModeHasChanged immediately
    1545           0 :                 bRet=true;
    1546           0 :             }
    1547             :         }
    1548           0 :         else if (!bOnlyEEItems)
    1549             :         {
    1550             :             // Otherwise split Set, if necessary.
    1551             :             // Now we build an ItemSet aSet that doesn't contain EE_Items from
    1552             :             // *pSet (otherwise it would be a copy).
    1553           0 :             sal_uInt16* pNewWhichTable=RemoveWhichRange(pSet->GetRanges(),EE_ITEMS_START,EE_ITEMS_END);
    1554           0 :             SfxItemSet aSet(pMod->GetItemPool(),pNewWhichTable);
    1555           0 :             delete[] pNewWhichTable;
    1556           0 :             SfxWhichIter aIter(aSet);
    1557           0 :             sal_uInt16 nWhich=aIter.FirstWhich();
    1558           0 :             while (nWhich!=0)
    1559             :             {
    1560             :                 const SfxPoolItem* pItem;
    1561           0 :                 SfxItemState eState=pSet->GetItemState(nWhich,false,&pItem);
    1562           0 :                 if (eState==SFX_ITEM_SET) aSet.Put(*pItem);
    1563           0 :                 nWhich=aIter.NextWhich();
    1564             :             }
    1565             : 
    1566             : 
    1567           0 :             if( mxSelectionController.is() )
    1568           0 :                 bRet=mxSelectionController->SetAttributes(aSet,bReplaceAll );
    1569             : 
    1570           0 :             if( !bRet )
    1571             :             {
    1572           0 :                 if( IsUndoEnabled() )
    1573             :                 {
    1574           0 :                     OUString aStr;
    1575           0 :                     ImpTakeDescriptionStr(STR_EditSetAttributes,aStr);
    1576           0 :                     BegUndo(aStr);
    1577           0 :                     AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*mxTextEditObj.get()));
    1578           0 :                     AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoAttrObject(*mxTextEditObj.get(),false,false));
    1579           0 :                     EndUndo();
    1580             :                 }
    1581             : 
    1582           0 :                 mxTextEditObj->SetMergedItemSetAndBroadcast(aSet, bReplaceAll);
    1583             : 
    1584           0 :                 if (GetMarkedObjectCount()==1 && GetMarkedObjectByIndex(0)==mxTextEditObj.get())
    1585             :                 {
    1586           0 :                     SetNotPersistAttrToMarked(aSet,bReplaceAll);
    1587             :                 }
    1588             :             }
    1589           0 :             FlushComeBackTimer();
    1590           0 :             bRet=true;
    1591             :         }
    1592           0 :         if(!bNoEEItems)
    1593             :         {
    1594             :             // and now the attributes to the EditEngine
    1595           0 :             if (bReplaceAll) {
    1596           0 :                 pTextEditOutlinerView->RemoveAttribs( true );
    1597             :             }
    1598           0 :             pTextEditOutlinerView->SetAttribs(rSet);
    1599             : 
    1600             : #ifdef DBG_UTIL
    1601             :             if (pItemBrowser!=NULL)
    1602             :                 pItemBrowser->SetDirty();
    1603             : #endif
    1604             : 
    1605           0 :             ImpMakeTextCursorAreaVisible();
    1606             :         }
    1607           0 :         bRet=true;
    1608             :     }
    1609           0 :     return bRet;
    1610             : }
    1611             : 
    1612           0 : SfxStyleSheet* SdrObjEditView::GetStyleSheet() const
    1613             : {
    1614           0 :     SfxStyleSheet* pSheet = 0;
    1615             : 
    1616           0 :     if( mxSelectionController.is() )
    1617             :     {
    1618           0 :         if( mxSelectionController->GetStyleSheet( pSheet ) )
    1619           0 :             return pSheet;
    1620             :     }
    1621             : 
    1622           0 :     if ( pTextEditOutlinerView )
    1623             :     {
    1624           0 :         pSheet = pTextEditOutlinerView->GetStyleSheet();
    1625             :     }
    1626             :     else
    1627             :     {
    1628           0 :         pSheet = SdrGlueEditView::GetStyleSheet();
    1629             :     }
    1630           0 :     return pSheet;
    1631             : }
    1632             : 
    1633           0 : bool SdrObjEditView::SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr)
    1634             : {
    1635           0 :     if( mxSelectionController.is() )
    1636             :     {
    1637           0 :         if( mxSelectionController->SetStyleSheet( pStyleSheet, bDontRemoveHardAttr ) )
    1638           0 :             return true;
    1639             :     }
    1640             : 
    1641             :     // if we are currently in edit mode we must also set the stylesheet
    1642             :     // on all paragraphs in the Outliner for the edit view
    1643           0 :     if( NULL != pTextEditOutlinerView )
    1644             :     {
    1645           0 :         Outliner* pOutliner = pTextEditOutlinerView->GetOutliner();
    1646             : 
    1647           0 :         const sal_Int32 nParaCount = pOutliner->GetParagraphCount();
    1648           0 :         for( sal_Int32 nPara = 0; nPara < nParaCount; nPara++ )
    1649             :         {
    1650           0 :             pOutliner->SetStyleSheet( nPara, pStyleSheet );
    1651             :         }
    1652             :     }
    1653             : 
    1654           0 :     return SdrGlueEditView::SetStyleSheet(pStyleSheet,bDontRemoveHardAttr);
    1655             : }
    1656             : 
    1657             : 
    1658             : 
    1659           0 : void SdrObjEditView::AddWindowToPaintView(OutputDevice* pNewWin)
    1660             : {
    1661           0 :     SdrGlueEditView::AddWindowToPaintView(pNewWin);
    1662             : 
    1663           0 :     if(mxTextEditObj.is() && !bTextEditOnlyOneView && pNewWin->GetOutDevType()==OUTDEV_WINDOW)
    1664             :     {
    1665           0 :         OutlinerView* pOutlView=ImpMakeOutlinerView((Window*)pNewWin,false,NULL);
    1666           0 :         pTextEditOutliner->InsertView(pOutlView);
    1667             :     }
    1668           0 : }
    1669             : 
    1670           0 : void SdrObjEditView::DeleteWindowFromPaintView(OutputDevice* pOldWin)
    1671             : {
    1672           0 :     SdrGlueEditView::DeleteWindowFromPaintView(pOldWin);
    1673             : 
    1674           0 :     if(mxTextEditObj.is() && !bTextEditOnlyOneView && pOldWin->GetOutDevType()==OUTDEV_WINDOW)
    1675             :     {
    1676           0 :         for (sal_uIntPtr i=pTextEditOutliner->GetViewCount(); i>0;) {
    1677           0 :             i--;
    1678           0 :             OutlinerView* pOLV=pTextEditOutliner->GetView(i);
    1679           0 :             if (pOLV && pOLV->GetWindow()==(Window*)pOldWin) {
    1680           0 :                 delete pTextEditOutliner->RemoveView(i);
    1681             :             }
    1682             :         }
    1683             :     }
    1684           0 : }
    1685             : 
    1686           0 : bool SdrObjEditView::IsTextEditInSelectionMode() const
    1687             : {
    1688           0 :     return pTextEditOutliner!=NULL && pTextEditOutliner->IsInSelectionMode();
    1689             : }
    1690             : 
    1691             : 
    1692             : // MacroMode
    1693             : 
    1694             : 
    1695           0 : bool SdrObjEditView::BegMacroObj(const Point& rPnt, short nTol, SdrObject* pObj, SdrPageView* pPV, Window* pWin)
    1696             : {
    1697           0 :     BrkMacroObj();
    1698           0 :     if (pObj!=NULL && pPV!=NULL && pWin!=NULL && pObj->HasMacro()) {
    1699           0 :         nTol=ImpGetHitTolLogic(nTol,NULL);
    1700           0 :         pMacroObj=pObj;
    1701           0 :         pMacroPV=pPV;
    1702           0 :         pMacroWin=pWin;
    1703           0 :         bMacroDown=false;
    1704           0 :         nMacroTol=sal_uInt16(nTol);
    1705           0 :         aMacroDownPos=rPnt;
    1706           0 :         MovMacroObj(rPnt);
    1707             :     }
    1708           0 :     return false;
    1709             : }
    1710             : 
    1711           0 : void SdrObjEditView::ImpMacroUp(const Point& rUpPos)
    1712             : {
    1713           0 :     if (pMacroObj!=NULL && bMacroDown)
    1714             :     {
    1715           0 :         SdrObjMacroHitRec aHitRec;
    1716           0 :         aHitRec.aPos=rUpPos;
    1717           0 :         aHitRec.aDownPos=aMacroDownPos;
    1718           0 :         aHitRec.nTol=nMacroTol;
    1719           0 :         aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
    1720           0 :         aHitRec.pPageView=pMacroPV;
    1721           0 :         aHitRec.pOut=pMacroWin;
    1722           0 :         pMacroObj->PaintMacro(*pMacroWin,Rectangle(),aHitRec);
    1723           0 :         bMacroDown=false;
    1724             :     }
    1725           0 : }
    1726             : 
    1727           0 : void SdrObjEditView::ImpMacroDown(const Point& rDownPos)
    1728             : {
    1729           0 :     if (pMacroObj!=NULL && !bMacroDown)
    1730             :     {
    1731           0 :         SdrObjMacroHitRec aHitRec;
    1732           0 :         aHitRec.aPos=rDownPos;
    1733           0 :         aHitRec.aDownPos=aMacroDownPos;
    1734           0 :         aHitRec.nTol=nMacroTol;
    1735           0 :         aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
    1736           0 :         aHitRec.pPageView=pMacroPV;
    1737           0 :         aHitRec.bDown=true;
    1738           0 :         aHitRec.pOut=pMacroWin;
    1739           0 :         pMacroObj->PaintMacro(*pMacroWin,Rectangle(),aHitRec);
    1740           0 :         bMacroDown=true;
    1741             :     }
    1742           0 : }
    1743             : 
    1744           0 : void SdrObjEditView::MovMacroObj(const Point& rPnt)
    1745             : {
    1746           0 :     if (pMacroObj!=NULL) {
    1747           0 :         SdrObjMacroHitRec aHitRec;
    1748           0 :         aHitRec.aPos=rPnt;
    1749           0 :         aHitRec.aDownPos=aMacroDownPos;
    1750           0 :         aHitRec.nTol=nMacroTol;
    1751           0 :         aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
    1752           0 :         aHitRec.pPageView=pMacroPV;
    1753           0 :         aHitRec.bDown=bMacroDown;
    1754           0 :         aHitRec.pOut=pMacroWin;
    1755           0 :         bool bDown=pMacroObj->IsMacroHit(aHitRec);
    1756           0 :         if (bDown) ImpMacroDown(rPnt);
    1757           0 :         else ImpMacroUp(rPnt);
    1758             :     }
    1759           0 : }
    1760             : 
    1761           0 : void SdrObjEditView::BrkMacroObj()
    1762             : {
    1763           0 :     if (pMacroObj!=NULL) {
    1764           0 :         ImpMacroUp(aMacroDownPos);
    1765           0 :         pMacroObj=NULL;
    1766           0 :         pMacroPV=NULL;
    1767           0 :         pMacroWin=NULL;
    1768             :     }
    1769           0 : }
    1770             : 
    1771           0 : bool SdrObjEditView::EndMacroObj()
    1772             : {
    1773           0 :     if (pMacroObj!=NULL && bMacroDown) {
    1774           0 :         ImpMacroUp(aMacroDownPos);
    1775           0 :         SdrObjMacroHitRec aHitRec;
    1776           0 :         aHitRec.aPos=aMacroDownPos;
    1777           0 :         aHitRec.aDownPos=aMacroDownPos;
    1778           0 :         aHitRec.nTol=nMacroTol;
    1779           0 :         aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
    1780           0 :         aHitRec.pPageView=pMacroPV;
    1781           0 :         aHitRec.bDown=true;
    1782           0 :         aHitRec.pOut=pMacroWin;
    1783           0 :         bool bRet=pMacroObj->DoMacro(aHitRec);
    1784           0 :         pMacroObj=NULL;
    1785           0 :         pMacroPV=NULL;
    1786           0 :         pMacroWin=NULL;
    1787           0 :         return bRet;
    1788             :     } else {
    1789           0 :         BrkMacroObj();
    1790           0 :         return false;
    1791             :     }
    1792             : }
    1793             : 
    1794             : /** fills the given any with a XTextCursor for the current text selection.
    1795             :     Leaves the any untouched if there currently is no text selected */
    1796           0 : void SdrObjEditView::getTextSelection( ::com::sun::star::uno::Any& rSelection )
    1797             : {
    1798           0 :     if( IsTextEdit() )
    1799             :     {
    1800           0 :         OutlinerView* pOutlinerView = GetTextEditOutlinerView();
    1801           0 :         if( pOutlinerView && pOutlinerView->HasSelection() )
    1802             :         {
    1803           0 :             SdrObject* pObj = GetTextEditObject();
    1804             : 
    1805           0 :             if( pObj )
    1806             :             {
    1807           0 :                 ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > xText( pObj->getUnoShape(), ::com::sun::star::uno::UNO_QUERY );
    1808           0 :                 if( xText.is() )
    1809             :                 {
    1810           0 :                     SvxUnoTextBase* pRange = SvxUnoTextBase::getImplementation( xText );
    1811           0 :                     if( pRange )
    1812             :                     {
    1813           0 :                         rSelection <<= pRange->createTextCursorBySelection( pOutlinerView->GetSelection() );
    1814             :                     }
    1815           0 :                 }
    1816             :             }
    1817             :         }
    1818             :     }
    1819           0 : }
    1820             : 
    1821             : /* check if we have a single selection and that single object likes
    1822             :     to handle the mouse and keyboard events itself
    1823             : 
    1824             :     TODO: the selection controller should be queried from the
    1825             :     object specific view contact. Currently this method only
    1826             :     works for tables.
    1827             : */
    1828           0 : void SdrObjEditView::MarkListHasChanged()
    1829             : {
    1830           0 :     SdrGlueEditView::MarkListHasChanged();
    1831             : 
    1832           0 :     if( mxSelectionController.is() )
    1833             :     {
    1834           0 :         mxLastSelectionController = mxSelectionController;
    1835           0 :         mxSelectionController->onSelectionHasChanged();
    1836             :     }
    1837             : 
    1838           0 :     mxSelectionController.clear();
    1839             : 
    1840           0 :     const SdrMarkList& rMarkList=GetMarkedObjectList();
    1841           0 :     if( rMarkList.GetMarkCount() == 1 )
    1842             :     {
    1843           0 :         const SdrObject* pObj= rMarkList.GetMark(0)->GetMarkedSdrObj();
    1844             :         // check for table
    1845           0 :         if( pObj && (pObj->GetObjInventor() == SdrInventor ) && (pObj->GetObjIdentifier() == OBJ_TABLE) )
    1846             :         {
    1847           0 :             mxSelectionController = sdr::table::CreateTableController( this, pObj, mxLastSelectionController );
    1848           0 :             if( mxSelectionController.is() )
    1849             :             {
    1850           0 :                 mxLastSelectionController.clear();
    1851           0 :                 mxSelectionController->onSelectionHasChanged();
    1852             :             }
    1853             :         }
    1854             :     }
    1855           0 : }
    1856             : 
    1857           0 : IMPL_LINK( SdrObjEditView, EndPasteOrDropHdl, PasteOrDropInfos*, pInfos )
    1858             : {
    1859           0 :     OnEndPasteOrDrop( pInfos );
    1860           0 :     return 0;
    1861             : }
    1862             : 
    1863           0 : IMPL_LINK( SdrObjEditView, BeginPasteOrDropHdl, PasteOrDropInfos*, pInfos )
    1864             : {
    1865           0 :     OnBeginPasteOrDrop( pInfos );
    1866           0 :     return 0;
    1867             : }
    1868             : 
    1869           0 : void SdrObjEditView::OnBeginPasteOrDrop( PasteOrDropInfos* )
    1870             : {
    1871             :     // applications can derive from these virtual methods to do something before a drop or paste operation
    1872           0 : }
    1873             : 
    1874           0 : void SdrObjEditView::OnEndPasteOrDrop( PasteOrDropInfos* )
    1875             : {
    1876             :     // applications can derive from these virtual methods to do something before a drop or paste operation
    1877           0 : }
    1878             : 
    1879           0 : sal_uInt16 SdrObjEditView::GetSelectionLevel() const
    1880             : {
    1881           0 :     sal_uInt16 nLevel = 0xFFFF;
    1882           0 :     if( IsTextEdit() )
    1883             :     {
    1884             :         DBG_ASSERT(pTextEditOutlinerView!=NULL,"SdrObjEditView::GetAttributes(): pTextEditOutlinerView=NULL");
    1885             :         DBG_ASSERT(pTextEditOutliner!=NULL,"SdrObjEditView::GetAttributes(): pTextEditOutliner=NULL");
    1886           0 :         if( pTextEditOutlinerView )
    1887             :         {
    1888             :             //start and end position
    1889           0 :             ESelection aSelect = pTextEditOutlinerView->GetSelection();
    1890           0 :             sal_uInt16 nStartPara = ::std::min( aSelect.nStartPara, aSelect.nEndPara );
    1891           0 :             sal_uInt16 nEndPara = ::std::max( aSelect.nStartPara, aSelect.nEndPara );
    1892             :             //get level from each paragraph
    1893           0 :             nLevel = 0;
    1894           0 :             for( sal_uInt16 nPara = nStartPara; nPara <= nEndPara; nPara++ )
    1895             :             {
    1896           0 :                 sal_uInt16 nParaDepth = 1 << pTextEditOutliner->GetDepth( nPara );
    1897           0 :                 if( !(nLevel & nParaDepth) )
    1898           0 :                     nLevel += nParaDepth;
    1899             :             }
    1900             :             //reduce one level for Outliner Object
    1901             :             //if( nLevel > 0 && GetTextEditObject()->GetObjIdentifier() == OBJ_OUTLINETEXT )
    1902             :             //  nLevel = nLevel >> 1;
    1903             :             //no bullet paragraph selected
    1904           0 :             if( nLevel == 0)
    1905           0 :                 nLevel = 0xFFFF;
    1906             :         }
    1907             :     }
    1908           0 :     return nLevel;
    1909             : }
    1910             : 
    1911           0 : bool SdrObjEditView::SupportsFormatPaintbrush( sal_uInt32 nObjectInventor, sal_uInt16 nObjectIdentifier ) const
    1912             : {
    1913           0 :     if( nObjectInventor != SdrInventor && nObjectInventor != E3dInventor )
    1914           0 :         return false;
    1915           0 :     switch(nObjectIdentifier)
    1916             :     {
    1917             :         case OBJ_NONE:
    1918             :         case OBJ_GRUP:
    1919           0 :             return false;
    1920             :         case OBJ_LINE:
    1921             :         case OBJ_RECT:
    1922             :         case OBJ_CIRC:
    1923             :         case OBJ_SECT:
    1924             :         case OBJ_CARC:
    1925             :         case OBJ_CCUT:
    1926             :         case OBJ_POLY:
    1927             :         case OBJ_PLIN:
    1928             :         case OBJ_PATHLINE:
    1929             :         case OBJ_PATHFILL:
    1930             :         case OBJ_FREELINE:
    1931             :         case OBJ_FREEFILL:
    1932             :         case OBJ_SPLNLINE:
    1933             :         case OBJ_SPLNFILL:
    1934             :         case OBJ_TEXT:
    1935             :         case OBJ_TEXTEXT:
    1936             :         case OBJ_TITLETEXT:
    1937             :         case OBJ_OUTLINETEXT:
    1938             :         case OBJ_GRAF:
    1939             :         case OBJ_OLE2:
    1940             :         case OBJ_TABLE:
    1941           0 :             return true;
    1942             :         case OBJ_EDGE:
    1943             :         case OBJ_CAPTION:
    1944           0 :             return false;
    1945             :         case OBJ_PATHPOLY:
    1946             :         case OBJ_PATHPLIN:
    1947           0 :             return true;
    1948             :         case OBJ_PAGE:
    1949             :         case OBJ_MEASURE:
    1950             :         case OBJ_DUMMY:
    1951             :         case OBJ_FRAME:
    1952             :         case OBJ_UNO:
    1953           0 :             return false;
    1954             :         case OBJ_CUSTOMSHAPE:
    1955           0 :             return true;
    1956             :         default:
    1957           0 :             return false;
    1958             :     }
    1959             : }
    1960             : 
    1961           0 : static const sal_uInt16* GetFormatRangeImpl( bool bTextOnly )
    1962             : {
    1963             :     static const sal_uInt16 gRanges[] = {
    1964             :         SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST,
    1965             :         SDRATTR_GRAF_FIRST, SDRATTR_GRAF_LAST,
    1966             :         SDRATTR_TABLE_FIRST, SDRATTR_TABLE_LAST,
    1967             :         XATTR_LINE_FIRST, XATTR_LINE_LAST,
    1968             :         XATTR_FILL_FIRST, XATTRSET_FILL,
    1969             :         EE_PARA_START, EE_PARA_END,
    1970             :         EE_CHAR_START, EE_CHAR_END,
    1971             :         0,0
    1972             :     };
    1973           0 :     return &gRanges[ bTextOnly ? 10 : 0];
    1974             : }
    1975             : 
    1976           0 : bool SdrObjEditView::TakeFormatPaintBrush( boost::shared_ptr< SfxItemSet >& rFormatSet  )
    1977             : {
    1978           0 :     if( mxSelectionController.is() && mxSelectionController->TakeFormatPaintBrush(rFormatSet) )
    1979           0 :         return true;
    1980             : 
    1981           0 :     const SdrMarkList& rMarkList = GetMarkedObjectList();
    1982           0 :     if( rMarkList.GetMarkCount() >= 1 )
    1983             :     {
    1984           0 :         OutlinerView* pOLV = GetTextEditOutlinerView();
    1985             : 
    1986           0 :         rFormatSet.reset( new SfxItemSet( GetModel()->GetItemPool(), GetFormatRangeImpl( pOLV != NULL ) ) );
    1987           0 :         if( pOLV )
    1988             :         {
    1989           0 :             rFormatSet->Put( pOLV->GetAttribs() );
    1990             :         }
    1991             :         else
    1992             :         {
    1993           0 :             const bool bOnlyHardAttr = false;
    1994           0 :             rFormatSet->Put( GetAttrFromMarked(bOnlyHardAttr) );
    1995             :         }
    1996           0 :         return true;
    1997             :     }
    1998             : 
    1999           0 :     return false;
    2000             : }
    2001             : 
    2002           0 : static SfxItemSet CreatePaintSet( const sal_uInt16 *pRanges, SfxItemPool& rPool, const SfxItemSet& rSourceSet, const SfxItemSet& rTargetSet, bool bNoCharacterFormats, bool bNoParagraphFormats )
    2003             : {
    2004           0 :     SfxItemSet aPaintSet( rPool, pRanges );
    2005             : 
    2006           0 :     while( *pRanges )
    2007             :     {
    2008           0 :         sal_uInt16 nWhich = *pRanges++;
    2009           0 :         const sal_uInt16 nLastWhich = *pRanges++;
    2010             : 
    2011           0 :         if( bNoCharacterFormats && (nWhich == EE_CHAR_START) )
    2012           0 :             continue;
    2013             : 
    2014           0 :         if( bNoParagraphFormats && (nWhich == EE_PARA_START ) )
    2015           0 :             continue;
    2016             : 
    2017           0 :         for( ; nWhich < nLastWhich; nWhich++ )
    2018             :         {
    2019           0 :             const SfxPoolItem* pSourceItem = rSourceSet.GetItem( nWhich );
    2020           0 :             const SfxPoolItem* pTargetItem = rTargetSet.GetItem( nWhich );
    2021             : 
    2022           0 :             if( (pSourceItem && !pTargetItem) || (pSourceItem && pTargetItem && !((*pSourceItem) == (*pTargetItem)) ) )
    2023             :             {
    2024           0 :                 aPaintSet.Put( *pSourceItem );
    2025             :             }
    2026             :         }
    2027             :     }
    2028           0 :     return aPaintSet;
    2029             : }
    2030             : 
    2031           0 : void SdrObjEditView::ApplyFormatPaintBrushToText( SfxItemSet& rFormatSet, SdrTextObj& rTextObj, SdrText* pText, bool bNoCharacterFormats, bool bNoParagraphFormats )
    2032             : {
    2033           0 :     OutlinerParaObject* pParaObj = pText ? pText->GetOutlinerParaObject() : 0;
    2034           0 :     if(pParaObj)
    2035             :     {
    2036           0 :         SdrOutliner& rOutliner = rTextObj.ImpGetDrawOutliner();
    2037           0 :         rOutliner.SetText(*pParaObj);
    2038             : 
    2039           0 :         sal_Int32 nParaCount(rOutliner.GetParagraphCount());
    2040             : 
    2041           0 :         if(nParaCount)
    2042             :         {
    2043           0 :             for(sal_Int32 nPara = 0; nPara < nParaCount; nPara++)
    2044             :             {
    2045           0 :                 if( !bNoCharacterFormats )
    2046           0 :                     rOutliner.QuickRemoveCharAttribs( nPara, /* remove all */0 );
    2047             : 
    2048           0 :                 SfxItemSet aSet(rOutliner.GetParaAttribs(nPara));
    2049           0 :                 aSet.Put(CreatePaintSet( GetFormatRangeImpl(true), *aSet.GetPool(), rFormatSet, aSet, bNoCharacterFormats, bNoParagraphFormats ) );
    2050           0 :                 rOutliner.SetParaAttribs(nPara, aSet);
    2051           0 :             }
    2052             : 
    2053           0 :             OutlinerParaObject* pTemp = rOutliner.CreateParaObject(0, nParaCount);
    2054           0 :             rOutliner.Clear();
    2055             : 
    2056           0 :             rTextObj.NbcSetOutlinerParaObjectForText(pTemp,pText);
    2057             :         }
    2058             :     }
    2059           0 : }
    2060             : 
    2061           0 : void SdrObjEditView::ApplyFormatPaintBrush( SfxItemSet& rFormatSet, bool bNoCharacterFormats, bool bNoParagraphFormats )
    2062             : {
    2063           0 :     if( !mxSelectionController.is() || !mxSelectionController->ApplyFormatPaintBrush( rFormatSet, bNoCharacterFormats, bNoParagraphFormats ) )
    2064             :     {
    2065           0 :         const SdrMarkList& rMarkList = GetMarkedObjectList();
    2066           0 :         SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
    2067           0 :         OutlinerView* pOLV = GetTextEditOutlinerView();
    2068             : 
    2069           0 :         const SfxItemSet& rShapeSet = pObj->GetMergedItemSet();
    2070             : 
    2071           0 :         if( !pOLV )
    2072             :         {
    2073             :             // if not in text edit mode (aka the user selected text or clicked on a word)
    2074             :             // apply formatting attributes to selected shape
    2075             :             // All formatting items (see ranges above) that are unequal in selected shape and
    2076             :             // the format paintbrush are hard set on the selected shape.
    2077             : 
    2078           0 :             const sal_uInt16* pRanges = rFormatSet.GetRanges();
    2079           0 :             bool bTextOnly = true;
    2080             : 
    2081           0 :             while( *pRanges )
    2082             :             {
    2083           0 :                 if( (*pRanges != EE_PARA_START) && (*pRanges != EE_CHAR_START) )
    2084             :                 {
    2085           0 :                     bTextOnly = false;
    2086           0 :                     break;
    2087             :                 }
    2088           0 :                 pRanges += 2;
    2089             :             }
    2090             : 
    2091           0 :             if( !bTextOnly )
    2092             :             {
    2093           0 :                 SfxItemSet aPaintSet( CreatePaintSet( GetFormatRangeImpl(false), *rShapeSet.GetPool(), rFormatSet, rShapeSet, bNoCharacterFormats, bNoParagraphFormats ) );
    2094           0 :                 const bool bReplaceAll = false;
    2095           0 :                 SetAttrToMarked(aPaintSet, bReplaceAll);
    2096             :             }
    2097             : 
    2098             :             // now apply character and paragraph formatting to text, if the shape has any
    2099           0 :             SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObj);
    2100           0 :             if( pTextObj )
    2101             :             {
    2102           0 :                 sal_Int32 nText = pTextObj->getTextCount();
    2103             : 
    2104           0 :                 while( --nText >= 0 )
    2105             :                 {
    2106           0 :                     SdrText* pText = pTextObj->getText( nText );
    2107           0 :                     ApplyFormatPaintBrushToText( rFormatSet, *pTextObj, pText, bNoCharacterFormats, bNoParagraphFormats );
    2108             :                 }
    2109             :             }
    2110             :         }
    2111             :         else
    2112             :         {
    2113           0 :             ::Outliner* pOutliner = pOLV->GetOutliner();
    2114           0 :             if( pOutliner )
    2115             :             {
    2116           0 :                 const EditEngine& rEditEngine = pOutliner->GetEditEngine();
    2117             : 
    2118           0 :                 ESelection aSel( pOLV->GetSelection() );
    2119           0 :                 if( !aSel.HasRange() )
    2120           0 :                     pOLV->SetSelection( rEditEngine.GetWord( aSel, com::sun::star::i18n::WordType::DICTIONARY_WORD ) );
    2121             : 
    2122           0 :                 const bool bRemoveParaAttribs = !bNoParagraphFormats;
    2123           0 :                 pOLV->RemoveAttribsKeepLanguages( bRemoveParaAttribs );
    2124           0 :                 SfxItemSet aSet( pOLV->GetAttribs() );
    2125           0 :                 SfxItemSet aPaintSet( CreatePaintSet(GetFormatRangeImpl(true), *aSet.GetPool(), rFormatSet, aSet, bNoCharacterFormats, bNoParagraphFormats ) );
    2126           0 :                 pOLV->SetAttribs( aPaintSet );
    2127             :             }
    2128             :         }
    2129             :     }
    2130           0 : }
    2131             : 
    2132             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10