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