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