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