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