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