xref: /trunk/main/sd/source/ui/func/futext.cxx (revision 30acf5e8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 
28 #include "futext.hxx"
29 #include <editeng/eeitem.hxx>
30 #include <editeng/editerr.hxx>
31 #include <svx/dlgutil.hxx>
32 #include <svx/svxerr.hxx>
33 #include <tools/urlobj.hxx>
34 #include <vcl/help.hxx>
35 #include <editeng/editstat.hxx>
36 #include <svl/aeitem.hxx>
37 #include <svl/intitem.hxx>
38 #include <svx/svdotext.hxx>
39 #include <svx/svdogrp.hxx>
40 #include <editeng/flditem.hxx>
41 #include <svl/style.hxx>
42 #include <svx/svdpagv.hxx>
43 #include <sfx2/viewfrm.hxx>
44 #include <sfx2/dispatch.hxx>
45 #include <sfx2/bindings.hxx>
46 #include <sfx2/request.hxx>
47 #include <editeng/editeng.hxx>
48 #include <svx/svdoutl.hxx>
49 #include <svx/svxids.hrc>
50 #include <sfx2/docfile.hxx>
51 #include <comphelper/processfactory.hxx>
52 #include <editeng/outlobj.hxx>
53 #include <svtools/langtab.hxx>
54 
55 // #104122#
56 #include <editeng/frmdiritem.hxx>
57 
58 #include <svx/svdetc.hxx>
59 #include <editeng/editview.hxx>
60 
61 #include "sdresid.hxx"
62 #include "app.hrc"
63 #include "res_bmp.hrc"
64 #include "ViewShell.hxx"
65 #include "ViewShellBase.hxx"
66 #include "View.hxx"
67 #include "Outliner.hxx"
68 #include "Window.hxx"
69 #include "drawdoc.hxx"
70 #include "sdpage.hxx"
71 #include "sdmod.hxx"
72 #include "FrameView.hxx"
73 #include "ToolBarManager.hxx"
74 #include "DrawDocShell.hxx"
75 #include "glob.hrc"
76 #include "pres.hxx"
77 #include "optsitem.hxx"
78 
79 using ::rtl::OUString;
80 using namespace ::com::sun::star;
81 using namespace ::com::sun::star::uno;
82 using namespace ::com::sun::star::lang;
83 using namespace ::com::sun::star::linguistic2;
84 
85 namespace sd {
86 
87 static sal_uInt16 SidArray[] = {
88 	SID_STYLE_FAMILY2,                //    5542
89 	SID_STYLE_FAMILY5,                //    5545
90 	SID_CUT,                          //    5710
91 	SID_COPY,                         //    5711
92 	SID_ATTR_TABSTOP,                 //   10002
93 	SID_ATTR_CHAR_FONT,               //   10007
94 	SID_ATTR_CHAR_POSTURE,            //   10008
95 	SID_ATTR_CHAR_WEIGHT,             //   10009
96 	SID_ATTR_CHAR_SHADOWED,		//10010
97 	SID_ATTR_CHAR_STRIKEOUT,		//10013
98 	SID_ATTR_CHAR_UNDERLINE,          //   10014
99 	SID_ATTR_CHAR_FONTHEIGHT,         //   10015
100 	SID_ATTR_CHAR_COLOR,              //   10017
101 	SID_ATTR_CHAR_KERNING,			//10018
102 	SID_ATTR_PARA_ADJUST_LEFT,        //   10028
103 	SID_ATTR_PARA_ADJUST_RIGHT,       //   10029
104 	SID_ATTR_PARA_ADJUST_CENTER,      //   10030
105 	SID_ATTR_PARA_ADJUST_BLOCK,       //   10031
106 	SID_ATTR_PARA_LINESPACE_10,       //   10034
107 	SID_ATTR_PARA_LINESPACE_15,       //   10035
108 	SID_ATTR_PARA_LINESPACE_20,       //   10036
109 	SID_ATTR_PARA_ULSPACE,  	   //   10042
110 	SID_ATTR_PARA_LRSPACE,            //   10043
111     SID_ATTR_TRANSFORM_POS_X, //  10088
112     SID_ATTR_TRANSFORM_POS_Y, //  10089
113     SID_ATTR_TRANSFORM_WIDTH, //  10090
114     SID_ATTR_TRANSFORM_HEIGHT,//  10091
115     SID_ATTR_TRANSFORM_ROT_X, //  10093
116     SID_ATTR_TRANSFORM_ROT_Y, //  10094
117     SID_ATTR_TRANSFORM_ANGLE, //  10095 //Added
118 	SID_OUTLINE_UP,                   //   10150
119 	SID_OUTLINE_DOWN,                 //   10151
120 	SID_OUTLINE_LEFT,                 //   10152
121 	SID_OUTLINE_RIGHT,                //   10153
122     SID_ATTR_TRANSFORM_PROTECT_POS,//  10236
123     SID_ATTR_TRANSFORM_PROTECT_SIZE,// 10237 //Added
124 	SID_FORMTEXT_STYLE,               //   10257
125 	SID_SET_SUPER_SCRIPT,             //   10294
126 	SID_SET_SUB_SCRIPT,               //   10295
127     SID_ATTR_TRANSFORM_AUTOWIDTH,//    10310
128     SID_ATTR_TRANSFORM_AUTOHEIGHT,//   10311 //Added
129 	SID_HYPERLINK_GETLINK,            //   10361
130 	SID_CHARMAP,					  //   10503
131 	SID_TEXTDIRECTION_LEFT_TO_RIGHT,  //   10907
132 	SID_TEXTDIRECTION_TOP_TO_BOTTOM,  //   10908
133     SID_ATTR_PARA_LEFT_TO_RIGHT,      //   10950
134     SID_ATTR_PARA_RIGHT_TO_LEFT,      //   10951
135 	FN_NUM_BULLET_ON,                 //   20138
136 	SID_PARASPACE_INCREASE,           //   27346
137 	SID_PARASPACE_DECREASE,           //   27347
138 							0 };
139 
140 TYPEINIT1( FuText, FuConstruct );
141 
142 
143 static sal_Bool bTestText = 0;
144 
145 /*************************************************************************
146 |*
147 |* Basisklasse fuer Textfunktionen
148 |*
149 \************************************************************************/
150 
FuText(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)151 FuText::FuText( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
152 : FuConstruct(pViewSh, pWin, pView, pDoc, rReq)
153 , bFirstObjCreated(sal_False)
154 , rRequest (rReq)
155 {
156 }
157 
Create(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)158 FunctionReference FuText::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
159 {
160 	FunctionReference xFunc( new FuText( pViewSh, pWin, pView, pDoc, rReq ) );
161 	return xFunc;
162 }
163 
164 /*************************************************************************
165 |*
166 |* Destruktor
167 |*
168 \************************************************************************/
169 
disposing()170 void FuText::disposing()
171 {
172 	if(mpView)
173 	{
174 		if(mpView->SdrEndTextEdit(sal_False) == SDRENDTEXTEDIT_DELETED)
175 			mxTextObj.reset( 0 );
176 
177 		// die RequestHandler der benutzten Outliner zuruecksetzen auf den
178 		// Handler am Dokument
179 		::Outliner* pOutliner = mpView->GetTextEditOutliner();
180 
181 		if (pOutliner)
182 			pOutliner->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(mpDoc->GetStyleSheetPool()));
183 	}
184 }
185 
186 /*************************************************************************
187 |*
188 |* Execute functionality of this class:
189 |*
190 |* #71422: Start the functionality of this class in this method
191 |* and not in the ctor.
192 |* If you construct an object of this class and you put the
193 |* address of this object to pFuActual you've got a problem,
194 |* because some methods inside DoExecute use the pFuActual-Pointer.
195 |* If the code inside DoExecute is executed inside the ctor,
196 |* the value of pFuActual is not right. And the value will not
197 |* be right until the ctor finished !!!
198 |*
199 \************************************************************************/
DoExecute(SfxRequest &)200 void FuText::DoExecute( SfxRequest& )
201 {
202 	mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBarShell(
203         ToolBarManager::TBG_FUNCTION,
204         RID_DRAW_TEXT_TOOLBOX);
205 
206 	mpView->SetCurrentObj(OBJ_TEXT);
207 	mpView->SetEditMode(SDREDITMODE_EDIT);
208 
209 	MouseEvent aMEvt(mpWindow->GetPointerPosPixel());
210 
211 	if (nSlotId == SID_TEXTEDIT)
212 	{
213 		// Try to select an object
214 		SdrPageView* pPV = mpView->GetSdrPageView();
215 		SdrViewEvent aVEvt;
216 		mpView->PickAnything(aMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
217 		mpView->MarkObj(aVEvt.pRootObj, pPV);
218 
219 		mxTextObj.reset( dynamic_cast< SdrTextObj* >( aVEvt.pObj ) );
220 	}
221 	else if (mpView->AreObjectsMarked())
222 	{
223 		const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
224 
225 		if (rMarkList.GetMarkCount() == 1)
226 		{
227 			SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
228 			mxTextObj.reset( dynamic_cast< SdrTextObj* >( pObj ) );
229 		}
230 	}
231 
232 	// check for table
233 	if (mpView->AreObjectsMarked())
234 	{
235 		const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
236 
237 		if (rMarkList.GetMarkCount() == 1)
238 		{
239 			SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
240 			if( pObj && (pObj->GetObjInventor() == SdrInventor ) && (pObj->GetObjIdentifier() == OBJ_TABLE) )
241 			{
242 				mpViewShell->GetViewShellBase().GetToolBarManager()->AddToolBarShell( ToolBarManager::TBG_FUNCTION, RID_DRAW_TABLE_TOOLBOX );
243 			}
244 		}
245 	}
246 
247 	sal_Bool bQuickDrag = sal_True;
248 
249 	const SfxItemSet* pArgs = rRequest.GetArgs();
250 
251 	if (pArgs
252 
253 		// #98198# test for type before using
254 		&& SID_TEXTEDIT == nSlotId
255 		&& SFX_ITEM_SET == pArgs->GetItemState(SID_TEXTEDIT)
256 
257 		&& (sal_uInt16)((SfxUInt16Item&)pArgs->Get(SID_TEXTEDIT)).GetValue() == 2)
258 	{
259 		// Selection by doubleclick -> don't allow QuickDrag
260 		bQuickDrag = sal_False;
261 	}
262 
263 	SetInEditMode(aMEvt, bQuickDrag);
264 }
265 
266 /*************************************************************************
267 |*
268 |* MouseButtonDown-event
269 |*
270 \************************************************************************/
271 
MouseButtonDown(const MouseEvent & rMEvt)272 sal_Bool FuText::MouseButtonDown(const MouseEvent& rMEvt)
273 {
274 	bMBDown = sal_True;
275 
276 	sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt);
277 
278     /* af: (de)Select object before showing the context menu.
279 	// Fuer PopupMenu (vorher DrawViewShell)
280 	if ((rMEvt.GetButtons() == MOUSE_RIGHT) && rMEvt.GetClicks() == 1 &&
281 		mpView->IsTextEdit())
282 	{
283 		return (sal_True);
284 	}
285         */
286 
287 	mpView->SetMarkHdlWhenTextEdit(sal_True);
288 	SdrViewEvent aVEvt;
289 	SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
290 
291 	if (eHit == SDRHIT_TEXTEDIT)
292 	{
293 		// Text getroffen -> Event von SdrView auswerten lassen
294 		if (mpView->MouseButtonDown(rMEvt, mpWindow))
295 			return (sal_True);
296 	}
297 
298 	if (rMEvt.GetClicks() == 1)
299 	{
300 		if (mpView->IsTextEdit() && eHit != SDRHIT_MARKEDOBJECT && eHit != SDRHIT_HANDLE)
301 		{
302 			// Texteingabe beenden
303 			if(mpView->SdrEndTextEdit() == SDRENDTEXTEDIT_DELETED)
304 			{
305 				// Bugfix von MBA: bei Doppelclick auf der Wiese im Modus Text wird
306 				// beim zweiten Click eHit = SDRHIT_TEXTEDITOBJ erhalten, weil ja der
307 				// zweite Click auf das im ersten Click angelegte TextObject geht.
308 				// Dieses wird aber in SdrEndTextEdit entfernt, weil es leer ist. Es
309 				// befindet sich aber noch in der Mark-Liste und der Aufruf MarkObj
310 				// weiter unten greift dann auf das tote Object zu.
311 				// Als einfacher Fix wird nach SdrEndTextEdit noch einmal eHit ermittelt,
312 				// was dann SDRHIT_NONE liefert.
313 				mxTextObj.reset( NULL );
314 				eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
315 			}
316 
317 			mpView->SetCurrentObj(OBJ_TEXT);
318 			mpView->SetEditMode(SDREDITMODE_EDIT);
319 		}
320 
321 		if (rMEvt.IsLeft() || rMEvt.IsRight())
322 		{
323 			mpWindow->CaptureMouse();
324 			SdrObject* pObj;
325 			SdrPageView* pPV = mpView->GetSdrPageView();
326 
327 			if (eHit == SDRHIT_TEXTEDIT)
328 			{
329 				SetInEditMode(rMEvt, sal_False);
330 			}
331 			else
332 			{
333 				sal_Bool bMacro = sal_False;
334 
335 				if (bMacro && mpView->PickObj(aMDPos,mpView->getHitTolLog(),pObj,pPV,SDRSEARCH_PICKMACRO))
336 				{
337 					// Makro
338 					sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
339 					mpView->BegMacroObj(aMDPos,nHitLog,pObj,pPV,mpWindow);
340 				}
341 				else
342 				{
343 					if (eHit != SDRHIT_HANDLE)
344 					{
345 						// Selektion aufheben
346 						if (!rMEvt.IsShift() && eHit == SDRHIT_TEXTEDITOBJ)
347 						{
348 							mpView->UnmarkAll();
349 							mpView->SetDragMode(SDRDRAG_MOVE);
350 						}
351 					}
352 
353 					if ( aVEvt.eEvent == SDREVENT_EXECUTEURL                   ||
354 						 eHit == SDRHIT_HANDLE                                 ||
355 						 eHit == SDRHIT_MARKEDOBJECT                           ||
356 						 eHit == SDRHIT_TEXTEDITOBJ                            ||
357 						 ( eHit == SDRHIT_UNMARKEDOBJECT && bFirstObjCreated &&
358 						   !bPermanent ) )
359 					{
360 						/**********************************************************
361 						* Handle, markiertes oder unmarkiertes Objekt getroffen
362 						**********************************************************/
363 						if (eHit == SDRHIT_TEXTEDITOBJ)
364 						{
365 							/******************************************************
366 							* Text eines unmarkierten Objekts getroffen:
367 							* Objekt wird selektiert und in EditMode versetzt
368 							******************************************************/
369 							mpView->MarkObj(aVEvt.pRootObj, pPV);
370 
371 							if (aVEvt.pObj && aVEvt.pObj->ISA(SdrTextObj))
372 							{
373 								mxTextObj.reset( static_cast<SdrTextObj*>(aVEvt.pObj) );
374 							}
375 
376 							SetInEditMode(rMEvt, sal_True);
377 						}
378 						else if (aVEvt.eEvent == SDREVENT_EXECUTEURL && !rMEvt.IsMod2())
379 						{
380 							/******************************************************
381 							* URL ausfuehren
382 							******************************************************/
383 							mpWindow->ReleaseMouse();
384 							SfxStringItem aStrItem(SID_FILE_NAME, aVEvt.pURLField->GetURL());
385 							SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName());
386 							SfxBoolItem aBrowseItem( SID_BROWSE, sal_True );
387 							SfxViewFrame* pFrame = mpViewShell->GetViewFrame();
388 							mpWindow->ReleaseMouse();
389 
390 							if (rMEvt.IsMod1())
391 							{
392 								// Im neuen Frame oeffnen
393 								pFrame->GetDispatcher()->Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
394 											&aStrItem, &aBrowseItem, &aReferer, 0L);
395 							}
396 							else
397 							{
398 								// Im aktuellen Frame oeffnen
399 								SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame);
400 								pFrame->GetDispatcher()->Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
401 											&aStrItem, &aFrameItem, &aBrowseItem, &aReferer, 0L);
402 							}
403 						}
404 						else
405 						{
406 							/******************************************************
407 							* Objekt oder Handle draggen
408 							******************************************************/
409 
410 							// #i78748#
411 							// do the EndTextEdit first, it will delete the handles and force a
412 							// recreation. This will make aVEvt.pHdl to point to a deleted handle,
413 							// thus it is necessary to reset it and to get it again.
414 
415 							// #i112855#
416 							// cl: I'm not sure why we checked here also for mxTextObj->GetOutlinerParaObjet
417 							// this caused SdrEndTextEdit() to be called also when not in text editing and
418 							// this does not make sense and caused troubles. (see issue 112855)
419 
420 //							::Outliner* pOutl = mpView->GetTextEditOutliner();
421 //
422 //							if (mxTextObj.is() && (mxTextObj->GetOutlinerParaObject() ||
423 //								(pOutl && pOutl->GetText(pOutl->GetParagraph( 0 )).Len() != 0)))
424 							if( mpView->IsTextEdit() )
425 							{
426 								mpView->SdrEndTextEdit();
427 
428 								if(aVEvt.pHdl)
429 								{
430 									// force new handle identification, the pointer will be dead here
431 									// since SdrEndTextEdit has resetted (deleted) the handles.
432 									aVEvt.pHdl = 0;
433 									mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
434 								}
435 							}
436 
437 							if (!aVEvt.pHdl)
438 							{
439 								if( eHit == SDRHIT_UNMARKEDOBJECT )
440 								{
441 									if ( !rMEvt.IsShift() )
442 										mpView->UnmarkAll();
443 
444 									mpView->MarkObj(aVEvt.pRootObj, pPV);
445 								}
446 
447 								// Objekt draggen
448 								bFirstMouseMove = sal_True;
449 								aDragTimer.Start();
450 							}
451 
452 
453                             if ( ! rMEvt.IsRight())
454                             {
455 							    // we need to pick again since SdrEndTextEdit can rebuild the handles list
456                                 eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
457 							    if( (eHit == SDRHIT_HANDLE) || (eHit == SDRHIT_MARKEDOBJECT) )
458 							    {
459 								    sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
460 								    mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, aVEvt.pHdl, nDrgLog);
461 							    }
462                             }
463                             bReturn = true;
464 						}
465 					}
466 					else if ( nSlotId != SID_TEXTEDIT &&
467 							  (bPermanent || !bFirstObjCreated) )
468 					{
469 						/**********************************************************
470 						* Objekt erzeugen
471 						**********************************************************/
472 						mpView->SetCurrentObj(OBJ_TEXT);
473 						mpView->SetEditMode(SDREDITMODE_CREATE);
474 						sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
475 						mpView->BegCreateObj(aMDPos, (OutputDevice*) NULL, nDrgLog);
476 					}
477 					else
478 					{
479 						/**********************************************************
480 						* Selektieren
481 						**********************************************************/
482 						if( !rMEvt.IsShift() )
483 							mpView->UnmarkAll();
484 
485 						mpView->BegMarkObj( aMDPos );
486 					}
487 				}
488 			}
489 		}
490 	}
491 	else if ( rMEvt.GetClicks() == 2 && !mpView->IsTextEdit() )
492 	{
493 		MouseEvent aMEvt( mpWindow->GetPointerPosPixel() );
494 		SetInEditMode( aMEvt, sal_False );
495 	}
496 
497 	if (!bIsInDragMode)
498 	{
499 		ForcePointer(&rMEvt);
500 		mpViewShell->GetViewFrame()->GetBindings().Invalidate(SidArray);
501 	}
502 
503 	return (bReturn);
504 }
505 
506 /*************************************************************************
507 |*
508 |* MouseMove-event
509 |*
510 \************************************************************************/
511 
MouseMove(const MouseEvent & rMEvt)512 sal_Bool FuText::MouseMove(const MouseEvent& rMEvt)
513 {
514 	sal_Bool bReturn = FuDraw::MouseMove(rMEvt);
515 
516 	if (aDragTimer.IsActive() )
517 	{
518 		if( bFirstMouseMove )
519 			bFirstMouseMove = sal_False;
520 		else
521 			aDragTimer.Stop();
522 	}
523 
524 	if (!bReturn && mpView->IsAction() && !mpDocSh->IsReadOnly())
525 	{
526 		Point aPix(rMEvt.GetPosPixel());
527 		Point aPnt(mpWindow->PixelToLogic(aPix));
528 
529 		ForceScroll(aPix);
530 		mpView->MovAction(aPnt);
531 	}
532 
533 	ForcePointer(&rMEvt);
534 
535 	return (bReturn);
536 }
537 
538 /*************************************************************************
539 |*
540 |* MouseButtonUp-event
541 |*
542 \************************************************************************/
543 
544 // #97016#
ImpSetAttributesForNewTextObject(SdrTextObj * pTxtObj)545 void FuText::ImpSetAttributesForNewTextObject(SdrTextObj* pTxtObj)
546 {
547 	if(mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS)
548 	{
549 		if( nSlotId == SID_ATTR_CHAR )
550 		{
551 			// Impress-Textobjekt wird erzeugt (faellt auf Zeilenhoehe zusammen)
552 			// Damit das Objekt beim anschliessenden Erzeugen gleich die richtige
553 			// Hoehe bekommt (sonst wird zuviel gepainted)
554 			SfxItemSet aSet(mpViewShell->GetPool());
555 			aSet.Put(SdrTextMinFrameHeightItem(0));
556 			aSet.Put(SdrTextAutoGrowWidthItem(sal_False));
557 			aSet.Put(SdrTextAutoGrowHeightItem(sal_True));
558 			pTxtObj->SetMergedItemSet(aSet);
559 			pTxtObj->AdjustTextFrameWidthAndHeight();
560 			aSet.Put(SdrTextMaxFrameHeightItem(pTxtObj->GetLogicRect().GetSize().Height()));
561 			pTxtObj->SetMergedItemSet(aSet);
562 		}
563 		else if( nSlotId == SID_ATTR_CHAR_VERTICAL )
564 		{
565 			SfxItemSet aSet(mpViewShell->GetPool());
566 			aSet.Put(SdrTextMinFrameWidthItem(0));
567 			aSet.Put(SdrTextAutoGrowWidthItem(sal_True));
568 			aSet.Put(SdrTextAutoGrowHeightItem(sal_False));
569 
570 			// #91853# Needs to be set since default is SDRTEXTHORZADJUST_BLOCK
571 			aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
572 			pTxtObj->SetMergedItemSet(aSet);
573 			pTxtObj->AdjustTextFrameWidthAndHeight();
574 			aSet.Put(SdrTextMaxFrameWidthItem(pTxtObj->GetLogicRect().GetSize().Width()));
575 			pTxtObj->SetMergedItemSet(aSet);
576 		}
577 	}
578 	else
579 	{
580 		if( nSlotId == SID_ATTR_CHAR_VERTICAL )
581 		{
582 			// draw text object, needs to be initialized when vertical text is used
583 			SfxItemSet aSet(mpViewShell->GetPool());
584 
585 			// #91510#
586 			aSet.Put(SdrTextAutoGrowWidthItem(sal_True));
587 			aSet.Put(SdrTextAutoGrowHeightItem(sal_False));
588 
589 			// #91508#
590 			//aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP));
591 			//aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
592 
593 			// #107235#
594 			// Set defaults for vertical klick-n'drag text object, pool defaults are:
595 			// SdrTextVertAdjustItem: SDRTEXTVERTADJUST_TOP
596 			// SdrTextHorzAdjustItem: SDRTEXTHORZADJUST_BLOCK
597 			// Analog to that (thus, #91508# was not completely correct):
598 			aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BLOCK));
599 			aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
600 
601 			pTxtObj->SetMergedItemSet(aSet);
602 		}
603 	}
604 }
605 
606 // #97016#
ImpSetAttributesFitToSize(SdrTextObj * pTxtObj)607 void FuText::ImpSetAttributesFitToSize(SdrTextObj* pTxtObj)
608 {
609 	// FitToSize (An Rahmen anpassen)
610 	SfxItemSet aSet(mpViewShell->GetPool(), SDRATTR_TEXT_AUTOGROWHEIGHT, SDRATTR_TEXT_AUTOGROWWIDTH);
611 	SdrFitToSizeType eFTS = SDRTEXTFIT_PROPORTIONAL;
612 	aSet.Put(SdrTextFitToSizeTypeItem(eFTS));
613 	aSet.Put(SdrTextAutoGrowHeightItem(sal_False));
614 	aSet.Put(SdrTextAutoGrowWidthItem(sal_False));
615 	pTxtObj->SetMergedItemSet(aSet);
616 	pTxtObj->AdjustTextFrameWidthAndHeight();
617 }
618 
619 // #97016#
ImpSetAttributesFitToSizeVertical(SdrTextObj * pTxtObj)620 void FuText::ImpSetAttributesFitToSizeVertical(SdrTextObj* pTxtObj)
621 {
622 	SfxItemSet aSet(mpViewShell->GetPool(),
623 		SDRATTR_TEXT_AUTOGROWHEIGHT, SDRATTR_TEXT_AUTOGROWWIDTH);
624 	SdrFitToSizeType eFTS = SDRTEXTFIT_PROPORTIONAL;
625 	aSet.Put(SdrTextFitToSizeTypeItem(eFTS));
626 	aSet.Put(SdrTextAutoGrowHeightItem(sal_False));
627 	aSet.Put(SdrTextAutoGrowWidthItem(sal_False));
628 	pTxtObj->SetMergedItemSet(aSet);
629 	pTxtObj->AdjustTextFrameWidthAndHeight();
630 }
631 
632 // #97016#
ImpSetAttributesFitCommon(SdrTextObj * pTxtObj)633 void FuText::ImpSetAttributesFitCommon(SdrTextObj* pTxtObj)
634 {
635 	// Normales Textobjekt
636 	if (mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS)
637 	{
638 		if( nSlotId == SID_ATTR_CHAR )
639 		{
640 			// Impress-Textobjekt (faellt auf Zeilenhoehe zusammen)
641 			SfxItemSet aSet(mpViewShell->GetPool());
642 			aSet.Put(SdrTextMinFrameHeightItem(0));
643 			aSet.Put(SdrTextMaxFrameHeightItem(0));
644 			aSet.Put(SdrTextAutoGrowHeightItem(sal_True));
645 			aSet.Put(SdrTextAutoGrowWidthItem(sal_False));
646 			pTxtObj->SetMergedItemSet(aSet);
647 		}
648 		else if( nSlotId == SID_ATTR_CHAR_VERTICAL )
649 		{
650 			SfxItemSet aSet(mpViewShell->GetPool());
651 			aSet.Put(SdrTextMinFrameWidthItem(0));
652 			aSet.Put(SdrTextMaxFrameWidthItem(0));
653 			aSet.Put(SdrTextAutoGrowWidthItem(sal_True));
654 			aSet.Put(SdrTextAutoGrowHeightItem(sal_False));
655 			pTxtObj->SetMergedItemSet(aSet);
656 		}
657 
658 		pTxtObj->AdjustTextFrameWidthAndHeight();
659 	}
660 }
661 
MouseButtonUp(const MouseEvent & rMEvt)662 sal_Bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
663 {
664 	sal_Bool bReturn = sal_False;
665 
666 	if (aDragTimer.IsActive())
667 	{
668 		aDragTimer.Stop();
669 		bIsInDragMode = sal_False;
670 	}
671 
672 	mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
673 
674 	Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
675 
676 	if( (mpView && mpView->MouseButtonUp(rMEvt, mpWindow)) || rMEvt.GetClicks() == 2 )
677 		return (sal_True); // Event von der SdrView ausgewertet
678 
679 	sal_Bool bEmptyTextObj = sal_False;
680 
681 	if (mxTextObj.is())
682 	{
683 		const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
684 
685 		if (rMarkList.GetMarkCount() == 1
686             && ( rMarkList.GetMark(0)->GetMarkedSdrObj() == mxTextObj.get()) )
687 		{
688 			if( mxTextObj.is() && !GetTextObj()->GetOutlinerParaObject() )
689 				bEmptyTextObj = sal_True;
690 			else
691 				bFirstObjCreated = sal_True;
692 		}
693 		else
694 		{
695 			mxTextObj.reset( 0 );
696 		}
697 	}
698 
699 	if( mpView && mpView->IsDragObj())
700 	{
701 		/**********************************************************************
702 		* Objekt wurde verschoben
703 		**********************************************************************/
704 		FrameView* pFrameView = mpViewShell->GetFrameView();
705 		sal_Bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy());
706 
707 		if (bDragWithCopy)
708 		{
709 			bDragWithCopy = !mpView->IsPresObjSelected(sal_False, sal_True);
710 		}
711 
712 		mpView->SetDragWithCopy(bDragWithCopy);
713 		mpView->EndDragObj( mpView->IsDragWithCopy() );
714 		mpView->ForceMarkedToAnotherPage();
715 		mpView->SetCurrentObj(OBJ_TEXT);
716 
717 	    sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
718 
719         if ( mpView->IsRotateAllowed() && mpViewShell->GetFrameView()->IsClickChangeRotation() && (rMEvt.GetClicks() != 2) &&
720 			!rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsRight() &&
721             Abs(aPnt.X() - aMDPos.X()) < nDrgLog &&
722             Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog)
723         {
724 			// toggle to rotation mode
725 			mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_ROTATE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
726 		}
727 	}
728 	else if( mpView && mpView->IsCreateObj() && rMEvt.IsLeft())
729 	{
730 		/**********************************************************************
731 		* Objekt wurde erzeugt
732 		**********************************************************************/
733 		mxTextObj.reset( dynamic_cast< SdrTextObj* >( mpView->GetCreateObj() ) );
734 
735 		if( mxTextObj.is() )
736 		{
737 			//AW outliner needs to be set to vertical when there is no
738 			// outliner object up to now; also it needs to be set back to not
739 			// vertical when there was a vertical one used last time.
740 			OutlinerParaObject* pOPO = GetTextObj()->GetOutlinerParaObject();
741 			SdrOutliner& rOutl = mxTextObj->GetModel()->GetDrawOutliner(GetTextObj());
742 			sal_Bool bVertical((pOPO && pOPO->IsVertical())
743 				|| nSlotId == SID_ATTR_CHAR_VERTICAL
744 				|| nSlotId == SID_TEXT_FITTOSIZE_VERTICAL);
745 			rOutl.SetVertical(bVertical);
746 
747 			// #107235#
748 			// Before ImpSetAttributesForNewTextObject the vertical writing mode
749 			// needs to be set at the object. This is done here at the OutlinerParaObject
750 			// directly to not mirror the layout text items involved. These items will be set
751 			// from ImpSetAttributesForNewTextObject and below.
752 			OutlinerParaObject* pPara = GetTextObj()->GetOutlinerParaObject();
753 
754 			if(!pPara)
755 			{
756 				GetTextObj()->ForceOutlinerParaObject();
757 				pPara = GetTextObj()->GetOutlinerParaObject();
758 			}
759 
760 			if(pPara && (bool)bVertical != pPara->IsVertical())
761 			{
762 				// set ParaObject orientation accordingly
763 				pPara->SetVertical(bVertical);
764 			}
765 
766 			// #97016#
767 			ImpSetAttributesForNewTextObject(GetTextObj());
768 		}
769 
770 		if (!mpView->EndCreateObj(SDRCREATE_FORCEEND))
771 		{
772 			// Textobjekt konnte nicht erzeugt werden
773 			mxTextObj.reset(0);
774 		}
775 		else if (nSlotId == SID_TEXT_FITTOSIZE)
776 		{
777 			// #97016#
778 			ImpSetAttributesFitToSize(GetTextObj());
779 
780 			SetInEditMode(rMEvt, sal_False);
781 		}
782 		else if ( nSlotId == SID_TEXT_FITTOSIZE_VERTICAL )
783 		{
784 			// #97016#
785 			ImpSetAttributesFitToSizeVertical(GetTextObj());
786 
787 			SetInEditMode(rMEvt, sal_False);
788 		}
789 		else
790 		{
791 			// #97016#
792 			ImpSetAttributesFitCommon(GetTextObj());
793 
794 			// Damit die Handles und der graue Rahmen stimmen
795 			mpView->AdjustMarkHdl();
796 			mpView->PickHandle(aPnt);
797 			SetInEditMode(rMEvt, sal_False);
798 		}
799 	}
800 	else if ( mpView && mpView->IsAction())
801 	{
802 		mpView->EndAction();
803 	}
804 
805 	ForcePointer(&rMEvt);
806 	mpWindow->ReleaseMouse();
807 	sal_uInt16 nDrgLog1 = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
808 
809 	if ( mpView && !mpView->AreObjectsMarked() &&
810 		 Abs(aMDPos.X() - aPnt.X()) < nDrgLog1 &&
811 		 Abs(aMDPos.Y() - aPnt.Y()) < nDrgLog1 &&
812 		 !rMEvt.IsShift() && !rMEvt.IsMod2() )
813 	{
814 		SdrPageView* pPV = mpView->GetSdrPageView();
815 		SdrViewEvent aVEvt;
816 		mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
817 		mpView->MarkObj(aVEvt.pRootObj, pPV);
818 	}
819 
820 	if ( !mxTextObj.is() && mpView )
821 	{
822 		if ( ( (!bEmptyTextObj   &&  bPermanent) ||
823 			 (!bFirstObjCreated && !bPermanent) ) &&
824 			  !mpDocSh->IsReadOnly()               &&
825 			  nSlotId != SID_TEXTEDIT )
826 		{
827 			/**********************************************************************
828 			* Mengentext (linksbuendiges AutoGrow)
829 			**********************************************************************/
830 			mpView->SetCurrentObj(OBJ_TEXT);
831 			mpView->SetEditMode(SDREDITMODE_CREATE);
832 			sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
833 			mpView->BegCreateObj(aMDPos, (OutputDevice*) NULL, nDrgLog);
834 
835 			sal_Bool bSnapEnabled = mpView->IsSnapEnabled();
836 
837 			if (bSnapEnabled)
838 				mpView->SetSnapEnabled(sal_False);
839 
840 			aPnt.X() += nDrgLog + nDrgLog;
841 			aPnt.Y() += nDrgLog + nDrgLog;
842 			mpView->MovAction(aPnt);
843 
844 			mxTextObj.reset( dynamic_cast< SdrTextObj* >( mpView->GetCreateObj() ) );
845 
846 			if(mxTextObj.is())
847 			{
848 				GetTextObj()->SetDisableAutoWidthOnDragging(sal_True);
849 			}
850 
851 			if(!mpView->EndCreateObj(SDRCREATE_FORCEEND))
852 			{
853 				mxTextObj.reset(0);
854 			}
855 
856 			if(bSnapEnabled)
857 				mpView->SetSnapEnabled(bSnapEnabled);
858 
859 			if(mxTextObj.is())
860 			{
861 				SfxItemSet aSet(mpViewShell->GetPool());
862 				aSet.Put(SdrTextMinFrameHeightItem(0));
863 				aSet.Put(SdrTextMinFrameWidthItem(0));
864 				aSet.Put(SdrTextAutoGrowHeightItem(sal_True));
865 				aSet.Put(SdrTextAutoGrowWidthItem(sal_True));
866 
867 				// #91508#
868 				if(nSlotId == SID_ATTR_CHAR_VERTICAL)
869 				{
870 					// #107235#
871 					//
872 					// Here, all items which need to be different from pool default need to be set
873 					// again on the newly created text object.
874 					// Since this is a simple klick text object, it is first created, then SetVertical()
875 					// is used, then ImpSetAttributesForNewTextObject is called and then the object is
876 					// deleted again since not the minimum drag distance was travelled. Then, a new
877 					// klick text object is created and thus all that stuff needs to be set again here.
878 					//
879 					// Before using the new object the vertical writing mode
880 					// needs to be set. This is done here at the OutlinerParaObject
881 					// directly to not mirror the layout text items involved. These items will be set
882 					// below.
883 					OutlinerParaObject* pPara = GetTextObj()->GetOutlinerParaObject();
884 
885 					if(!pPara)
886 					{
887 						GetTextObj()->ForceOutlinerParaObject();
888 						pPara = GetTextObj()->GetOutlinerParaObject();
889 					}
890 
891 					if(pPara && sal_True != pPara->IsVertical())
892 					{
893 						// set ParaObject orientation accordingly
894 						pPara->SetVertical(sal_True);
895 					}
896 
897 					// #91508#
898 					// aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP));
899 					aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
900 
901 					// #107235#
902 					// Analog to the else case below, for vertical simple click texts
903 					// one of the defaulted set items from ImpSetAttributesForNewTextObject
904 					// needs to be adapted to non-block mode. This could have been done with the
905 					// #104122#, but was obviously overseen.
906 					const SfxItemSet& rSet = mpView->GetDefaultAttr();
907 					SvxFrameDirection eDirection = (SvxFrameDirection)((SvxFrameDirectionItem&)rSet.Get(EE_PARA_WRITINGDIR)).GetValue();
908 
909 					if(FRMDIR_HORI_RIGHT_TOP == eDirection || FRMDIR_VERT_TOP_RIGHT == eDirection)
910 					{
911 	                    aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BOTTOM));
912 					}
913 					else
914 					{
915 	                    aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP));
916 					}
917 				}
918 				else
919 				{
920 					// #104122# This is for Format/Page settings. Since this also leads
921 					// to the object defaults to be changed, i think this code can be
922 					// removed. CL. wanted to take a look before adding this.
923                     //const SdrTextHorzAdjust eHA = ( ( pDoc && pDoc->GetDefaultWritingMode() == ::com::sun::star::text::WritingMode_RL_TB ) ?
924                     //                                SDRTEXTHORZADJUST_RIGHT : SDRTEXTHORZADJUST_LEFT );
925                     //aSet.Put( SdrTextHorzAdjustItem( eHA ) );
926 
927 					// #104122# Look in the object defaults if left-to-right is wanted. If
928 					// yes, set text anchoring to right to let the box grow to left.
929 					const SfxItemSet& rSet = mpView->GetDefaultAttr();
930 					SvxFrameDirection eDirection = (SvxFrameDirection)((SvxFrameDirectionItem&)rSet.Get(EE_PARA_WRITINGDIR)).GetValue();
931 
932 					if(FRMDIR_HORI_RIGHT_TOP == eDirection)
933 					{
934 	                    aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
935 					}
936 					else
937 					{
938 	                    aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_LEFT));
939 					}
940 				}
941 
942 				GetTextObj()->SetMergedItemSet(aSet);
943 				GetTextObj()->SetDisableAutoWidthOnDragging(sal_True);
944 				SetInEditMode(rMEvt, sal_False);
945 			}
946 
947 			bFirstObjCreated = sal_True;
948 		}
949 		else
950 		{
951 			// In die Fkt. Selektion wechseln
952 			if (mpView->SdrEndTextEdit() == SDRENDTEXTEDIT_DELETED)
953 			{
954 				mxTextObj.reset(0);
955 			}
956 
957 			mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_SELECT,
958 									  SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
959 		}
960 	}
961 
962 	bMBDown = sal_False;
963 	FuConstruct::MouseButtonUp(rMEvt);
964 	return (bReturn);
965 }
966 
967 /*************************************************************************
968 |*
969 |* Tastaturereignisse bearbeiten
970 |*
971 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
972 |* sal_False.
973 |*
974 \************************************************************************/
975 
KeyInput(const KeyEvent & rKEvt)976 sal_Bool FuText::KeyInput(const KeyEvent& rKEvt)
977 {
978 	sal_Bool bReturn = sal_False;
979 	mpView->SetMarkHdlWhenTextEdit(sal_True);
980 
981 	KeyCode nCode = rKEvt.GetKeyCode();
982 	sal_Bool bShift = nCode.IsShift();
983 
984 	// #97016# IV
985 	if(mxTextObj.is())
986 	{
987 		// maybe object is deleted, test if it's equal to the selected object
988 		const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
989 		SdrObject* pSelectedObj = 0L;
990 
991 		if(1 == rMarkList.GetMarkCount())
992 		{
993 			SdrMark* pMark = rMarkList.GetMark(0);
994 			pSelectedObj = pMark->GetMarkedSdrObj();
995 		}
996 
997 		if(mxTextObj.get() != pSelectedObj)
998 		{
999 			mxTextObj.reset(0);
1000 		}
1001 	}
1002 
1003 	if ( mxTextObj.is() && mxTextObj->GetObjInventor() == SdrInventor && mxTextObj->GetObjIdentifier() == OBJ_TITLETEXT && rKEvt.GetKeyCode().GetCode() == KEY_RETURN )
1004 	{
1005 		// Titeltext-Objekt: immer "weiche" Umbrueche
1006 		bShift = sal_True;
1007 	}
1008 
1009 	sal_uInt16 nKey = nCode.GetCode();
1010 	KeyCode aKeyCode (nKey, bShift, nCode.IsMod1(), nCode.IsMod2(), nCode.IsMod3() );
1011 	KeyEvent aKEvt(rKEvt.GetCharCode(), aKeyCode);
1012 
1013 	sal_Bool bOK = sal_True;
1014 
1015 	if (mpDocSh->IsReadOnly())
1016 	{
1017 		bOK = !EditEngine::DoesKeyChangeText(aKEvt);
1018 	}
1019 	if( aKeyCode.GetCode() == KEY_PAGEUP || aKeyCode.GetCode() == KEY_PAGEDOWN )
1020 	{
1021 		bOK = sal_False;   // default handling in base class
1022 	}
1023 
1024 	if (bOK && mpView->KeyInput(aKEvt, mpWindow) )
1025 	{
1026 		bReturn = sal_True;
1027 
1028 		mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
1029 
1030 //		if ( pTextObj )
1031 //			pTextObj->SetEmptyPresObj(sal_False);
1032 	}
1033 	else if (aKeyCode == KEY_ESCAPE)
1034 	{
1035 		bReturn = cancel();
1036 	}
1037 
1038 	if( bPermanent )
1039 	{
1040 		mpView->SetCurrentObj(OBJ_TEXT);
1041 		mpView->SetEditMode(SDREDITMODE_CREATE);
1042 	}
1043 
1044 	if (!bReturn)
1045 	{
1046 		bReturn = FuDraw::KeyInput(aKEvt);
1047 	}
1048 
1049 	return (bReturn);
1050 }
1051 
1052 
1053 
1054 /*************************************************************************
1055 |*
1056 |* Function aktivieren
1057 |*
1058 \************************************************************************/
1059 
Activate()1060 void FuText::Activate()
1061 {
1062 	mpView->SetQuickTextEditMode(mpViewShell->GetFrameView()->IsQuickEdit());
1063 
1064     // #i89661# it's no longer necessary to make it so big here, it's fine tuned
1065     // for text objects in SdrMarkView::CheckSingleSdrObjectHit
1066 	mpView->SetHitTolerancePixel( 2 * HITPIX );
1067 
1068 	OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
1069 
1070 	if (pOLV)
1071 		pOLV->ShowCursor();
1072 
1073 	FuConstruct::Activate();
1074 
1075 	if( pOLV )
1076 		mpView->SetEditMode(SDREDITMODE_EDIT);
1077 }
1078 
1079 
1080 /*************************************************************************
1081 |*
1082 |* Function deaktivieren
1083 |*
1084 \************************************************************************/
1085 
Deactivate()1086 void FuText::Deactivate()
1087 {
1088 	OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
1089 
1090 	if (pOLV)
1091 		pOLV->HideCursor();
1092 
1093 	mpView->SetHitTolerancePixel( HITPIX );
1094 
1095 	FuConstruct::Deactivate();
1096 }
1097 
1098 
1099 /*************************************************************************
1100 |*
1101 |* Objekt in Edit-Mode setzen
1102 |*
1103 \************************************************************************/
1104 
SetInEditMode(const MouseEvent & rMEvt,sal_Bool bQuickDrag)1105 void FuText::SetInEditMode(const MouseEvent& rMEvt, sal_Bool bQuickDrag)
1106 {
1107 	SdrPageView* pPV = mpView->GetSdrPageView();
1108 	if( mxTextObj.is() && (mxTextObj->GetPage() == pPV->GetPage()) )
1109 	{
1110 		mpView->SetCurrentObj(OBJ_TEXT);
1111 
1112 		if( bPermanent )
1113 			mpView->SetEditMode(SDREDITMODE_CREATE);
1114 		else
1115 			mpView->SetEditMode(SDREDITMODE_EDIT);
1116 
1117 		sal_Bool bEmptyOutliner = sal_False;
1118 
1119 		if (!GetTextObj()->GetOutlinerParaObject() && mpView->GetTextEditOutliner())
1120 		{
1121 			::Outliner* pOutl = mpView->GetTextEditOutliner();
1122 			sal_uLong nParaAnz = pOutl->GetParagraphCount();
1123 			Paragraph* p1stPara = pOutl->GetParagraph( 0 );
1124 
1125 			if (nParaAnz==1 && p1stPara)
1126 			{
1127 				// Bei nur einem Pararaph
1128 				if (pOutl->GetText(p1stPara).Len() == 0)
1129 				{
1130 					bEmptyOutliner = sal_True;
1131 				}
1132 			}
1133 		}
1134 
1135 		if (GetTextObj() != mpView->GetTextEditObject() || bEmptyOutliner)
1136 		{
1137 			sal_uInt32 nInv = mxTextObj->GetObjInventor();
1138 			sal_uInt16 nSdrObjKind = mxTextObj->GetObjIdentifier();
1139 
1140 			if (nInv == SdrInventor && GetTextObj()->HasTextEdit() &&
1141 				(nSdrObjKind == OBJ_TEXT ||
1142 			 	nSdrObjKind == OBJ_TITLETEXT ||
1143 			 	nSdrObjKind == OBJ_OUTLINETEXT || !mxTextObj->IsEmptyPresObj() ) )
1144 			{
1145 				// Neuen Outliner machen (gehoert der SdrObjEditView)
1146 				SdrOutliner* pOutl = SdrMakeOutliner( OUTLINERMODE_OUTLINEOBJECT, mpDoc );
1147 
1148 				if (bEmptyOutliner)
1149 					mpView->SdrEndTextEdit(sal_True);
1150 
1151 				SdrTextObj* pTextObj = GetTextObj();
1152 				if( pTextObj )
1153 				{
1154 					OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject();
1155 					if( ( pOPO && pOPO->IsVertical() ) || (nSlotId == SID_ATTR_CHAR_VERTICAL) || (nSlotId == SID_TEXT_FITTOSIZE_VERTICAL) )
1156 						pOutl->SetVertical( sal_True );
1157 
1158 					if( pTextObj->getTextCount() > 1 )
1159 					{
1160 						Point aPix(rMEvt.GetPosPixel());
1161 						Point aPnt(mpWindow->PixelToLogic(aPix));
1162 						pTextObj->setActiveText( pTextObj->CheckTextHit(aPnt ) );
1163 					}
1164 
1165 					if (mpView->SdrBeginTextEdit(pTextObj, pPV, mpWindow, sal_True, pOutl) && mxTextObj->GetObjInventor() == SdrInventor)
1166 					{
1167 						bFirstObjCreated = sal_True;
1168 						DeleteDefaultText();
1169 
1170 						OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
1171 
1172 						nSdrObjKind = mxTextObj->GetObjIdentifier();
1173 
1174 						SdrViewEvent aVEvt;
1175 						SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
1176 
1177 						if (eHit == SDRHIT_TEXTEDIT)
1178 						{
1179 							// Text getroffen
1180 							if (nSdrObjKind == OBJ_TEXT ||
1181 								nSdrObjKind == OBJ_TITLETEXT ||
1182 								nSdrObjKind == OBJ_OUTLINETEXT ||
1183 								nSdrObjKind == OBJ_TABLE ||
1184 								nSlotId == SID_TEXTEDIT ||
1185 								!bQuickDrag)
1186 							{
1187 								pOLV->MouseButtonDown(rMEvt);
1188 								pOLV->MouseMove(rMEvt);
1189 								pOLV->MouseButtonUp(rMEvt);
1190 							}
1191 
1192 							if (mpViewShell->GetFrameView()->IsQuickEdit() && bQuickDrag && GetTextObj()->GetOutlinerParaObject())
1193 							{
1194 								pOLV->MouseButtonDown(rMEvt);
1195 							}
1196 						}
1197 						else
1198 						{
1199 							// #98198# Move cursor to end of text
1200 							ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND);
1201 							if (pOLV != NULL)
1202 								pOLV->SetSelection(aNewSelection);
1203 						}
1204 					}
1205 					else
1206 					{
1207 						mpView->RestoreDefaultText(dynamic_cast< SdrTextObj* >( mxTextObj.get() ));
1208 					}
1209 				}
1210 			}
1211 		}
1212 	}
1213 	else
1214 	{
1215 		mxTextObj.reset(0);
1216 	}
1217 }
1218 
1219 /*************************************************************************
1220 |*
1221 |* Texteingabe wird gestartet, ggf. Default-Text loeschen
1222 |*
1223 \************************************************************************/
1224 
DeleteDefaultText()1225 sal_Bool FuText::DeleteDefaultText()
1226 {
1227 	sal_Bool bDeleted = sal_False;
1228 
1229 	if ( mxTextObj.is() && mxTextObj->IsEmptyPresObj() )
1230 	{
1231 		String aString;
1232 		SdPage* pPage = (SdPage*) mxTextObj->GetPage();
1233 
1234 		if (pPage)
1235 		{
1236 			PresObjKind ePresObjKind = pPage->GetPresObjKind(mxTextObj.get());
1237 
1238 			if ( (ePresObjKind == PRESOBJ_TITLE   ||
1239 				  ePresObjKind == PRESOBJ_OUTLINE ||
1240 				  ePresObjKind == PRESOBJ_NOTES   ||
1241 				  ePresObjKind == PRESOBJ_TEXT) &&
1242 				  !pPage->IsMasterPage() )
1243 			{
1244 				::Outliner* pOutliner = mpView->GetTextEditOutliner();
1245 				SfxStyleSheet* pSheet = pOutliner->GetStyleSheet( 0 );
1246 				sal_Bool bIsUndoEnabled = pOutliner->IsUndoEnabled();
1247 				if( bIsUndoEnabled )
1248 					pOutliner->EnableUndo(sal_False);
1249 
1250 				pOutliner->SetText( String(), pOutliner->GetParagraph( 0 ) );
1251 
1252 				if( bIsUndoEnabled )
1253 					pOutliner->EnableUndo(sal_True);
1254 
1255 				if (pSheet &&
1256 					(ePresObjKind == PRESOBJ_NOTES || ePresObjKind == PRESOBJ_TEXT))
1257 					pOutliner->SetStyleSheet(0, pSheet);
1258 
1259 				mxTextObj->SetEmptyPresObj(sal_True);
1260 				bDeleted = sal_True;
1261 			}
1262 		}
1263 	}
1264 
1265 	return(bDeleted);
1266 }
1267 
1268 /*************************************************************************
1269 |*
1270 |* Command-event
1271 |*
1272 \************************************************************************/
1273 
Command(const CommandEvent & rCEvt)1274 sal_Bool FuText::Command(const CommandEvent& rCEvt)
1275 {
1276 	return( FuPoor::Command(rCEvt) );
1277 }
1278 
1279 /*************************************************************************
1280 |*
1281 |* Help-event
1282 |*
1283 \************************************************************************/
1284 
RequestHelp(const HelpEvent & rHEvt)1285 sal_Bool FuText::RequestHelp(const HelpEvent& rHEvt)
1286 {
1287 	sal_Bool bReturn = sal_False;
1288 
1289 	OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
1290 
1291 	if ((Help::IsBalloonHelpEnabled() || Help::IsQuickHelpEnabled()) &&
1292 		mxTextObj.is() && pOLV && pOLV->GetFieldUnderMousePointer())
1293 	{
1294 		String aHelpText;
1295 		const SvxFieldItem* pFieldItem = pOLV->GetFieldUnderMousePointer();
1296 		const SvxFieldData* pField = pFieldItem->GetField();
1297 
1298 		if (pField && pField->ISA(SvxURLField))
1299 		{
1300 			/******************************************************************
1301 			* URL-Field
1302 			******************************************************************/
1303 			aHelpText = INetURLObject::decode( ((const SvxURLField*)pField)->GetURL(), '%', INetURLObject::DECODE_WITH_CHARSET );
1304 		}
1305 		if (aHelpText.Len())
1306 		{
1307 			Rectangle aLogicPix = mpWindow->LogicToPixel(mxTextObj->GetLogicRect());
1308 			Rectangle aScreenRect(mpWindow->OutputToScreenPixel(aLogicPix.TopLeft()),
1309 								  mpWindow->OutputToScreenPixel(aLogicPix.BottomRight()));
1310 
1311 			if (Help::IsBalloonHelpEnabled())
1312 			{
1313 				bReturn = Help::ShowBalloon( (Window*)mpWindow, rHEvt.GetMousePosPixel(), aScreenRect, aHelpText);
1314 			}
1315 			else if (Help::IsQuickHelpEnabled())
1316 			{
1317 				bReturn = Help::ShowQuickHelp( (Window*)mpWindow, aScreenRect, aHelpText);
1318 			}
1319 		}
1320 	}
1321 
1322 	if (!bReturn)
1323 	{
1324 		bReturn = FuConstruct::RequestHelp(rHEvt);
1325 	}
1326 
1327 	return(bReturn);
1328 }
1329 
1330 /*************************************************************************
1331 |*
1332 |* Request verarbeiten
1333 |*
1334 \************************************************************************/
1335 
ReceiveRequest(SfxRequest & rReq)1336 void FuText::ReceiveRequest(SfxRequest& rReq)
1337 {
1338 	nSlotId = rReq.GetSlot();
1339 
1340 	// Dann Basisklasse rufen (dort wird u.a. nSlotId NICHT gesetzt)
1341 	FuPoor::ReceiveRequest(rReq);
1342 
1343 	if (nSlotId == SID_TEXTEDIT || mpViewShell->GetFrameView()->IsQuickEdit() || /*#95971#*/ SID_ATTR_CHAR == nSlotId)
1344 	{
1345 		MouseEvent aMEvt(mpWindow->GetPointerPosPixel());
1346 
1347 		mxTextObj.reset(0);
1348 
1349 		if (nSlotId == SID_TEXTEDIT)
1350 		{
1351 			// Wird gerade editiert?
1352 			if(!bTestText)
1353 				mxTextObj.reset( dynamic_cast< SdrTextObj* >( mpView->GetTextEditObject() ) );
1354 
1355 			if (!mxTextObj.is())
1356 			{
1357 				// Versuchen, ein Obj zu selektieren
1358 				SdrPageView* pPV = mpView->GetSdrPageView();
1359 				SdrViewEvent aVEvt;
1360 				mpView->PickAnything(aMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
1361 				mpView->MarkObj(aVEvt.pRootObj, pPV);
1362 
1363 				if (aVEvt.pObj && aVEvt.pObj->ISA(SdrTextObj))
1364 				{
1365 					mxTextObj.reset( static_cast< SdrTextObj* >( aVEvt.pObj ) );
1366 				}
1367 			}
1368 		}
1369 		else if (mpView->AreObjectsMarked())
1370 		{
1371 			const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
1372 
1373 			if (rMarkList.GetMarkCount() == 1)
1374 			{
1375 				SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
1376 
1377 				if (pObj->ISA(SdrTextObj))
1378 				{
1379 					mxTextObj.reset( static_cast< SdrTextObj* >( pObj ) );
1380 				}
1381 			}
1382 		}
1383 
1384 		sal_Bool bQuickDrag = sal_True;
1385 
1386 		const SfxItemSet* pArgs = rReq.GetArgs();
1387 
1388 		if (pArgs
1389 
1390 			// #98198# test for type before using
1391 			&& SID_TEXTEDIT == nSlotId
1392 			&& SFX_ITEM_SET == pArgs->GetItemState(SID_TEXTEDIT)
1393 
1394 			&& (sal_uInt16) ((SfxUInt16Item&) pArgs->Get(SID_TEXTEDIT)).GetValue() == 2)
1395 		{
1396 			// Anwahl per Doppelklick -> kein QuickDrag zulassen
1397 			bQuickDrag = sal_False;
1398 		}
1399 
1400 		SetInEditMode(aMEvt, bQuickDrag);
1401 	}
1402 }
1403 
1404 
1405 
1406 /*************************************************************************
1407 |*
1408 |* SpellChecker: Error-LinkHdl
1409 |*
1410 \************************************************************************/
1411 
IMPL_LINK(FuText,SpellError,void *,nLang)1412 IMPL_LINK( FuText, SpellError, void *, nLang )
1413 {
1414 	String aError( SvtLanguageTable::GetLanguageString( (LanguageType)(sal_uLong)nLang ) );
1415 	ErrorHandler::HandleError(* new StringErrorInfo(
1416 								ERRCODE_SVX_LINGU_LANGUAGENOTEXISTS, aError) );
1417 	return 0;
1418 }
1419 
1420 
1421 /*************************************************************************
1422 |*
1423 |* Reaktion auf Doppelklick
1424 |*
1425 \************************************************************************/
DoubleClick(const MouseEvent &)1426 void FuText::DoubleClick(const MouseEvent& )
1427 {
1428 	// Nichts zu tun
1429 }
1430 
1431 /** #97016#
1432     #105815# Removed the insertion of default text and putting a new text
1433     object directly into edit mode.
1434 */
CreateDefaultObject(const sal_uInt16 nID,const Rectangle & rRectangle)1435 SdrObject* FuText::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle)
1436 {
1437 	// case SID_TEXTEDIT:	// BASIC ???
1438 	// case SID_ATTR_CHAR:
1439 	// case SID_ATTR_CHAR_VERTICAL:
1440 	// case SID_TEXT_FITTOSIZE:
1441 	// case SID_TEXT_FITTOSIZE_VERTICAL:
1442 
1443 	SdrObject* pObj = SdrObjFactory::MakeNewObject(
1444 		mpView->GetCurrentObjInventor(), mpView->GetCurrentObjIdentifier(),
1445 		0L, mpDoc);
1446 
1447 	if(pObj)
1448 	{
1449 		if(pObj->ISA(SdrTextObj))
1450 		{
1451 			SdrTextObj* pText = (SdrTextObj*)pObj;
1452 			pText->SetLogicRect(rRectangle);
1453 
1454 			sal_Bool bVertical = (SID_ATTR_CHAR_VERTICAL == nID || SID_TEXT_FITTOSIZE_VERTICAL == nID);
1455 			pText->SetVerticalWriting(bVertical);
1456 
1457 			// #97016#
1458 			ImpSetAttributesForNewTextObject(pText);
1459 
1460 			if (nSlotId == SID_TEXT_FITTOSIZE)
1461 			{
1462 				// #97016#
1463 				ImpSetAttributesFitToSize(pText);
1464 			}
1465 			else if ( nSlotId == SID_TEXT_FITTOSIZE_VERTICAL )
1466 			{
1467 				// #97016#
1468 				ImpSetAttributesFitToSizeVertical(pText);
1469 			}
1470 			else
1471 			{
1472 				// #97016#
1473 				ImpSetAttributesFitCommon(pText);
1474 			}
1475 
1476             // Put text object into edit mode.
1477             SdrPageView* pPV = mpView->GetSdrPageView();
1478             mpView->SdrBeginTextEdit(pText, pPV);
1479 		}
1480 		else
1481 		{
1482 			DBG_ERROR("Object is NO text object");
1483 		}
1484 	}
1485 
1486 	return pObj;
1487 }
1488 
1489 
1490 
1491 
1492 /** is called when the currenct function should be aborted. <p>
1493 	This is used when a function gets a KEY_ESCAPE but can also
1494 	be called directly.
1495 
1496 	@returns true if a active function was aborted
1497 */
cancel()1498 bool FuText::cancel()
1499 {
1500 	if ( mpView->IsTextEdit() )
1501 	{
1502 		if(mpView->SdrEndTextEdit() == SDRENDTEXTEDIT_DELETED)
1503 			mxTextObj.reset(0);
1504 
1505 		mpView->SetCurrentObj(OBJ_TEXT);
1506 		mpView->SetEditMode(SDREDITMODE_EDIT);
1507 		return true;
1508 	}
1509 	else
1510 	{
1511 		return false;
1512 	}
1513 }
1514 
ChangeFontSize(bool bGrow,OutlinerView * pOLV,const FontList * pFontList,::sd::View * pView)1515 void FuText::ChangeFontSize( bool bGrow, OutlinerView* pOLV, const FontList* pFontList, ::sd::View* pView )
1516 {
1517     if( !pFontList || !pView )
1518         return;
1519 
1520     if( pOLV )
1521     {
1522         pOLV->GetEditView().ChangeFontSize( bGrow, pFontList );
1523     }
1524     else
1525     {
1526 //		SdDrawDocument* pDoc = pView->GetDoc();
1527 
1528         const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
1529         for( sal_uInt32 nMark = 0; nMark < rMarkList.GetMarkCount(); nMark++ )
1530         {
1531             SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( rMarkList.GetMark(nMark)->GetMarkedSdrObj() );
1532             if( pTextObj )
1533             {
1534                 for( sal_Int32 nText = 0; nText < pTextObj->getTextCount(); nText++ )
1535                 {
1536                     pTextObj->setActiveText( nText );
1537 
1538                     // Put text object into edit mode.
1539                     SdrPageView* pPV = pView->GetSdrPageView();
1540                     pView->SdrBeginTextEdit(pTextObj, pPV);
1541 
1542                     pOLV = pView->GetTextEditOutlinerView();
1543                     if( pOLV )
1544                     {
1545                         EditEngine* pEditEngine = pOLV->GetEditView().GetEditEngine();
1546                         if( pEditEngine )
1547                         {
1548                             ESelection aSel;
1549                             aSel.nEndPara = pEditEngine->GetParagraphCount()-1;
1550                             aSel.nEndPos = pEditEngine->GetTextLen(aSel.nEndPara);
1551                             pOLV->SetSelection(aSel);
1552                         }
1553 
1554                         ChangeFontSize( bGrow, pOLV, pFontList, pView );
1555                     }
1556 
1557                     pView->SdrEndTextEdit();
1558                 }
1559 
1560                 SfxItemSet aShapeSet( pTextObj->GetMergedItemSet() );
1561                 if( EditView::ChangeFontSize( bGrow, aShapeSet, pFontList ) )
1562                 {
1563                     pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT ) );
1564                     pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT_CJK ) );
1565                     pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT_CTL ) );
1566                 }
1567             }
1568         }
1569     }
1570 }
1571 
1572 } // end of namespace sd
1573 
1574