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