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 setted 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