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