xref: /AOO41X/main/sc/source/ui/drawfunc/futext.cxx (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
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_sc.hxx"
26 
27 #include <svx/svddef.hxx>
28 #include <svx/svdoutl.hxx>
29 #include <editeng/outlobj.hxx>
30 #include <svx/sdtaaitm.hxx>
31 #include <svx/sdtacitm.hxx>
32 #include <svx/svdotext.hxx>
33 #include <editeng/unolingu.hxx>
34 #include <svx/svdocapt.hxx>
35 #include <sfx2/bindings.hxx>
36 #include <sfx2/dispatch.hxx>
37 #include <sfx2/viewfrm.hxx>
38 #include <svx/svxids.hrc>
39 #include <editeng/eeitem.hxx>
40 #include <svl/itemset.hxx>
41 
42 #include "futext.hxx"
43 #include "drwlayer.hxx"
44 #include "sc.hrc"
45 #include "tabvwsh.hxx"
46 #include "drawview.hxx"
47 
48 // #98185# Create default drawing objects via keyboard
49 #include "scresid.hxx"
50 
51 //  Maximal erlaubte Mausbewegung um noch Drag&Drop zu starten
52 //! fusel,fuconstr,futext - zusammenfassen!
53 #define SC_MAXDRAGMOVE  3
54 
55 //------------------------------------------------------------------
56 
57 void lcl_InvalidateAttribs( SfxBindings& rBindings )
58 {
59     rBindings.Invalidate( SID_ATTR_CHAR_WEIGHT );
60     rBindings.Invalidate( SID_ATTR_CHAR_POSTURE );
61     rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE );
62     rBindings.Invalidate( SID_ULINE_VAL_NONE );
63     rBindings.Invalidate( SID_ULINE_VAL_SINGLE );
64     rBindings.Invalidate( SID_ULINE_VAL_DOUBLE );
65     rBindings.Invalidate( SID_ULINE_VAL_DOTTED );
66     rBindings.Invalidate( SID_ATTR_CHAR_OVERLINE );
67     rBindings.Invalidate( SID_ATTR_CHAR_COLOR );
68     rBindings.Invalidate( SID_ATTR_CHAR_FONT );
69     rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
70     rBindings.Invalidate( SID_ALIGNLEFT );
71     rBindings.Invalidate( SID_ALIGNCENTERHOR );
72     rBindings.Invalidate( SID_ALIGNRIGHT );
73     rBindings.Invalidate( SID_ALIGNBLOCK );
74     rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_10 );
75     rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_15 );
76     rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_20 );
77     rBindings.Invalidate( SID_SET_SUPER_SCRIPT );
78     rBindings.Invalidate( SID_SET_SUB_SCRIPT );
79     rBindings.Invalidate( SID_HYPERLINK_GETLINK );
80     rBindings.Invalidate( SID_TEXTDIRECTION_LEFT_TO_RIGHT );
81     rBindings.Invalidate( SID_TEXTDIRECTION_TOP_TO_BOTTOM );
82     rBindings.Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT );
83     rBindings.Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT );
84     // pseudo slots for Format menu
85     rBindings.Invalidate( SID_ALIGN_ANY_LEFT );
86     rBindings.Invalidate( SID_ALIGN_ANY_HCENTER );
87     rBindings.Invalidate( SID_ALIGN_ANY_RIGHT );
88     rBindings.Invalidate( SID_ALIGN_ANY_JUSTIFIED );
89 }
90 
91 void lcl_UpdateHyphenator( Outliner& rOutliner, SdrObject* pObj )
92 {
93     // use hyphenator only if hyphenation attribute is set
94     if ( pObj && ((const SfxBoolItem&)pObj->GetMergedItem(EE_PARA_HYPHENATE)).GetValue() ) {
95             com::sun::star::uno::Reference<com::sun::star::linguistic2::XHyphenator> xHyphenator( LinguMgr::GetHyphenator() );
96             rOutliner.SetHyphenator( xHyphenator );
97     }
98 }
99 
100 /*************************************************************************
101 |*
102 |* Basisklasse fuer Textfunktionen
103 |*
104 \************************************************************************/
105 
106 FuText::FuText(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP,
107                    SdrModel* pDoc, SfxRequest& rReq) :
108     FuConstruct(pViewSh, pWin, pViewP, pDoc, rReq),
109     pTextObj(NULL)
110 {
111 }
112 
113 /*************************************************************************
114 |*
115 |* Destruktor
116 |*
117 \************************************************************************/
118 
119 FuText::~FuText()
120 {
121 //  StopEditMode();                 // in Deactivate !
122 }
123 
124 /*************************************************************************
125 |*
126 |* MouseButtonDown-event
127 |*
128 \************************************************************************/
129 
130 sal_Bool __EXPORT FuText::MouseButtonDown(const MouseEvent& rMEvt)
131 {
132     // #95491# remember button state for creation of own MouseEvents
133     SetMouseButtonCode(rMEvt.GetButtons());
134 
135     if ( pView->MouseButtonDown(rMEvt, pWindow) )
136         return (sal_True);                 // Event von der SdrView ausgewertet
137 
138     if ( pView->IsTextEdit() )
139     {
140         if( !IsSizingOrMovingNote(rMEvt) )
141             StopEditMode();            // Danebengeklickt, Ende mit Edit
142         pView->SetCreateMode();
143     }
144 
145     aMDPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() );
146 
147     if ( rMEvt.IsLeft() )
148     {
149         SdrHdl* pHdl = pView->PickHandle(aMDPos);
150 
151         sal_uLong nHdlNum = pView->GetHdlNum(pHdl);
152 
153         if (pHdl != NULL)
154         {
155             if (pView->HasMarkablePoints() && pView->IsPointMarkable(*pHdl))
156             {
157                 sal_Bool bPointMarked=pView->IsPointMarked(*pHdl);
158 
159                 if ( rMEvt.IsShift() )
160                 {
161                     if (!bPointMarked)
162                     {
163                         pView->MarkPoint(*pHdl);
164                     }
165                     else
166                     {
167                         pView->UnmarkPoint(*pHdl);
168                     }
169                 }
170                 else
171                 {
172                     if (!bPointMarked)
173                     {
174                         pView->UnmarkAllPoints();
175                         pView->MarkPoint(*pHdl);
176                     }
177                 }
178                 pHdl=pView->GetHdl(nHdlNum);
179             }
180         }
181 
182         SdrObject* pObj;
183         SdrPageView* pPV;
184 
185         if ( pHdl != NULL || pView->IsMarkedHit(aMDPos) )
186         {
187             if (pHdl == NULL &&
188 //              pView->TakeTextEditObject(aMDPos, pObj, pPV) )
189                 pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKTEXTEDIT) )
190             {
191                 SdrOutliner* pO = MakeOutliner();
192                 lcl_UpdateHyphenator( *pO, pObj );
193 
194                 //  vertical flag:
195                 //  deduced from slot ids only if text object has no content
196 
197                 sal_uInt16 nSlotID = aSfxRequest.GetSlot();
198                 sal_Bool bVertical = ( nSlotID == SID_DRAW_TEXT_VERTICAL );
199                 OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
200                 if ( pOPO )
201                     bVertical = pOPO->IsVertical();     // content wins
202                 pO->SetVertical( bVertical );
203 
204                 //!??   ohne uebergebenen Outliner stimmen die Defaults nicht ???!?
205                 if ( pView->SdrBeginTextEdit(pObj, pPV, pWindow, sal_True, pO) )
206                 {
207                     //  EditEngine-UndoManager anmelden
208                     pViewShell->SetDrawTextUndo( &pO->GetUndoManager() );
209 
210                     OutlinerView* pOLV = pView->GetTextEditOutlinerView();
211                     if ( pOLV->MouseButtonDown(rMEvt) )
212                         return (sal_True); // Event an den Outliner
213                 }
214             }
215             else
216             {
217                 // disable tail & circular move for caption objects.
218                 bool bDrag = false;
219                 const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
220                 if( rMarkList.GetMarkCount() == 1 )
221                 {
222                     SdrObject* pMarkedObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
223                     if( ScDrawLayer::IsNoteCaption( pMarkedObj ) )
224                     {
225                         if(pHdl->GetKind() != HDL_POLY && pHdl->GetKind() != HDL_CIRC)
226                             bDrag = true;
227                     }
228                     else
229                         bDrag = true;   // different object
230                 }
231                 else
232                     bDrag = true;       // several objects
233 
234                 if ( bDrag )
235                 {
236                     aDragTimer.Start();
237                     pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl);
238                 }
239             }
240         }
241         else
242         {
243             sal_Bool bMacro = sal_False;
244 
245 //          if (bMacro && pView->TakeMacroObject(aMDPos,pObj,pPV))
246             if (bMacro && pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKMACRO) )
247 
248             {
249                 pView->BegMacroObj(aMDPos,pObj,pPV,pWindow);
250             }
251             else
252             {
253                 if (pView->IsEditMode())
254                 {
255                     sal_Bool bPointMode=pView->HasMarkablePoints();
256 
257                     if (!rMEvt.IsShift())
258                     {
259                         if (bPointMode)
260                         {
261                             pView->UnmarkAllPoints();
262                         }
263                         else
264                         {
265                             pView->UnmarkAll();
266                         }
267 
268                         pView->SetDragMode(SDRDRAG_MOVE);
269                         SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
270                         rBindings.Invalidate( SID_OBJECT_ROTATE );
271                         rBindings.Invalidate( SID_OBJECT_MIRROR );
272                         pHdl=pView->GetHdl(nHdlNum);
273                     }
274 
275                     if ( pView->MarkObj(aMDPos, -2, sal_False, rMEvt.IsMod1()) )
276                     {
277                         aDragTimer.Start();
278 
279                         pHdl=pView->PickHandle(aMDPos);
280 
281                         if (pHdl!=NULL)
282                         {
283                             pView->MarkPoint(*pHdl);
284                             pHdl=pView->GetHdl(nHdlNum);
285                         }
286 
287                         pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl);
288                     }
289                     else
290                     {
291                         if (bPointMode)
292                         {
293                             pView->BegMarkPoints(aMDPos);
294                         }
295                         else
296                         {
297                             pView->BegMarkObj(aMDPos);
298                         }
299                     }
300                 }
301                 else if (aSfxRequest.GetSlot() == SID_DRAW_NOTEEDIT )
302                 {
303                     //  Notizen editieren -> keine neuen Textobjekte erzeugen,
304                     //  stattdessen Textmodus verlassen
305 
306                     pViewShell->GetViewData()->GetDispatcher().
307                         Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
308                 }
309                 else
310                 {
311                     /**********************************************************
312                     * Objekt erzeugen
313                     **********************************************************/
314                     pView->BegCreateObj(aMDPos, (OutputDevice*) NULL);
315                 }
316             }
317         }
318     }
319 
320 
321     if (!bIsInDragMode)
322     {
323         pWindow->CaptureMouse();
324 //      ForcePointer(&rMEvt);
325         lcl_InvalidateAttribs( pViewShell->GetViewFrame()->GetBindings() );
326     }
327 
328     pViewShell->SetActivePointer(pView->GetPreferedPointer(
329                     pWindow->PixelToLogic(rMEvt.GetPosPixel()), pWindow ));
330 
331 //  return (bReturn);
332     return sal_True;
333 }
334 
335 /*************************************************************************
336 |*
337 |* MouseMove-event
338 |*
339 \************************************************************************/
340 
341 sal_Bool __EXPORT FuText::MouseMove(const MouseEvent& rMEvt)
342 {
343     sal_Bool bReturn = sal_False;
344 
345 //  pViewShell->SetActivePointer(aNewPointer);
346 
347     pViewShell->SetActivePointer(pView->GetPreferedPointer(
348                     pWindow->PixelToLogic(rMEvt.GetPosPixel()), pWindow ));
349 
350     if (aDragTimer.IsActive() )
351     {
352         Point aOldPixel = pWindow->LogicToPixel( aMDPos );
353         Point aNewPixel = rMEvt.GetPosPixel();
354         if ( Abs( aOldPixel.X() - aNewPixel.X() ) > SC_MAXDRAGMOVE ||
355              Abs( aOldPixel.Y() - aNewPixel.Y() ) > SC_MAXDRAGMOVE )
356             aDragTimer.Stop();
357     }
358 
359     if ( pView->MouseMove(rMEvt, pWindow) )
360         return (sal_True); // Event von der SdrView ausgewertet
361 
362     if ( pView->IsAction() )
363     {
364 /*      aNewPointer = Pointer(POINTER_TEXT);
365         pViewShell->SetActivePointer(aNewPointer);
366 */
367         Point aPix(rMEvt.GetPosPixel());
368         Point aPnt(pWindow->PixelToLogic(aPix));
369 
370         ForceScroll(aPix);
371         pView->MovAction(aPnt);
372     }
373 
374 //  ForcePointer(&rMEvt);
375 
376     return (bReturn);
377 }
378 
379 /*************************************************************************
380 |*
381 |* MouseButtonUp-event
382 |*
383 \************************************************************************/
384 
385 sal_Bool __EXPORT FuText::MouseButtonUp(const MouseEvent& rMEvt)
386 {
387     // #95491# remember button state for creation of own MouseEvents
388     SetMouseButtonCode(rMEvt.GetButtons());
389 
390     sal_Bool bReturn = sal_False;
391 
392     if (aDragTimer.IsActive() )
393     {
394         aDragTimer.Stop();
395     }
396 
397     lcl_InvalidateAttribs( pViewShell->GetViewFrame()->GetBindings() );
398 
399     Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
400 
401     if ( pView->MouseButtonUp(rMEvt, pWindow) )
402         return (sal_True); // Event von der SdrView ausgewertet
403 
404     if ( pView->IsDragObj() )
405     {
406         pView->EndDragObj( rMEvt.IsShift() );
407         const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
408         if (rMarkList.GetMarkCount() == 1)
409         {
410             SdrMark* pMark = rMarkList.GetMark(0);
411             SdrObject* pObj = pMark->GetMarkedSdrObj();
412             FuPoor* pPoor = pViewShell->GetViewData()->GetView()->GetDrawFuncPtr();
413             FuText* pText = static_cast<FuText*>(pPoor);
414             pText->StopDragMode(pObj );
415         }
416         pView->ForceMarkedToAnotherPage();
417     }
418     else if ( pView->IsCreateObj() )
419     {
420         if (rMEvt.IsLeft())
421         {
422             pView->EndCreateObj(SDRCREATE_FORCEEND);
423             if (aSfxRequest.GetSlot() == SID_DRAW_TEXT_MARQUEE)
424             {
425                 //  Lauftext-Objekt erzeugen?
426 
427                 const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
428                 if (rMarkList.GetMark(0))
429                 {
430                     SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
431 
432                     // die fuer das Scrollen benoetigten Attribute setzen
433                     SfxItemSet aItemSet( pDrDoc->GetItemPool(),
434                                             SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST);
435 
436                     aItemSet.Put( SdrTextAutoGrowWidthItem( sal_False ) );
437                     aItemSet.Put( SdrTextAutoGrowHeightItem( sal_False ) );
438                     aItemSet.Put( SdrTextAniKindItem( SDRTEXTANI_SLIDE ) );
439                     aItemSet.Put( SdrTextAniDirectionItem( SDRTEXTANI_LEFT ) );
440                     aItemSet.Put( SdrTextAniCountItem( 1 ) );
441                     aItemSet.Put( SdrTextAniAmountItem(
442                                     (sal_Int16)pWindow->PixelToLogic(Size(2,1)).Width()) );
443                     pObj->SetMergedItemSetAndBroadcast(aItemSet);
444                 }
445             }
446 
447             // #93382# init object different when vertical writing
448             sal_uInt16 nSlotID(aSfxRequest.GetSlot());
449             sal_Bool bVertical = (SID_DRAW_TEXT_VERTICAL == nSlotID);
450             if(bVertical)
451             {
452                 const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
453                 if(rMarkList.GetMark(0))
454                 {
455                     SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
456                     if(pObj && pObj->ISA(SdrTextObj))
457                     {
458                         SdrTextObj* pText = (SdrTextObj*)pObj;
459                         SfxItemSet aSet(pDrDoc->GetItemPool());
460 
461                         pText->SetVerticalWriting(sal_True);
462 
463                         aSet.Put(SdrTextAutoGrowWidthItem(sal_True));
464                         aSet.Put(SdrTextAutoGrowHeightItem(sal_False));
465                         aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP));
466                         aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
467 
468                         pText->SetMergedItemSet(aSet);
469                     }
470                 }
471             }
472 
473             SetInEditMode();
474 
475                 //  Modus verlassen bei einzelnem Klick
476                 //  (-> fuconstr)
477 
478             if ( !pView->AreObjectsMarked() )
479             {
480                 pView->MarkObj(aPnt, -2, sal_False, rMEvt.IsMod1());
481 
482                 SfxDispatcher& rDisp = pViewShell->GetViewData()->GetDispatcher();
483                 if ( pView->AreObjectsMarked() )
484                     rDisp.Execute(SID_OBJECT_SELECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
485                 else
486                     rDisp.Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
487             }
488         }
489     }
490     else if ( pView->IsAction() )
491     {
492         pView->EndAction();
493     }
494     else if( !pView->IsAction() )
495     {
496         pWindow->ReleaseMouse();
497 
498         if ( !pView->AreObjectsMarked() && rMEvt.GetClicks() < 2 )
499         {
500             pView->MarkObj(aPnt, -2, sal_False, rMEvt.IsMod1());
501 
502             SfxDispatcher& rDisp = pViewShell->GetViewData()->GetDispatcher();
503             if ( pView->AreObjectsMarked() )
504                 rDisp.Execute(SID_OBJECT_SELECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
505             else
506                 rDisp.Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
507         }
508     }
509 
510     return (bReturn);
511 }
512 
513 /*************************************************************************
514 |*
515 |* Maus-Pointer umschalten
516 |*
517 \************************************************************************/
518 
519 void FuText::ForcePointer(const MouseEvent* /* pMEvt */)
520 {
521     pViewShell->SetActivePointer( aNewPointer );
522 
523 /*
524     if ( !pView->IsAction() )
525     {
526         Point aPnt(pWindow->PixelToLogic( pWindow->ScreenToOutputPixel(
527                    Pointer::GetPosPixel() ) ) );
528         SdrHdl* pHdl=pView->HitHandle(aPnt, *pWindow);
529 
530         if (pHdl!=NULL)
531         {
532             pViewShell->SetActivePointer(pHdl->GetPointer() );
533         }
534         else
535         {
536             SdrObject* pObj;
537             SdrPageView* pPV;
538 
539             if ( pView->IsMarkedHit(aPnt) )
540             {
541                 if ( pView->TakeTextEditObject(aPnt, pObj, pPV) )
542                 {
543                     pViewShell->SetActivePointer(Pointer(POINTER_TEXT));
544                 }
545                 else
546                 {
547                     pViewShell->SetActivePointer(Pointer(POINTER_MOVE));
548                 }
549             }
550             else
551             {
552 //              if ( pView->TakeMacroObject(aPnt, pObj, pPV) )
553                 if ( pView->PickObj(aPnt, pObj, pPV, SDRSEARCH_PICKMACRO) )
554                 {
555                     pViewShell->SetActivePointer( pObj->GetMacroPointer() );
556                 }
557                 else
558                 {
559                     pViewShell->SetActivePointer( aNewPointer );
560                 }
561             }
562         }
563     }
564 */
565 }
566 
567 
568 
569 /*************************************************************************
570 |*
571 |* Tastaturereignisse bearbeiten
572 |*
573 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
574 |* FALSE.
575 |*
576 \************************************************************************/
577 
578 sal_Bool __EXPORT FuText::KeyInput(const KeyEvent& rKEvt)
579 {
580     sal_Bool bReturn = sal_False;
581 
582     if ( pView->KeyInput(rKEvt, pWindow) )
583     {
584         bReturn = sal_True;
585         lcl_InvalidateAttribs( pViewShell->GetViewFrame()->GetBindings() );
586     }
587     else
588     {
589         bReturn = FuDraw::KeyInput(rKEvt);
590     }
591 
592     return (bReturn);
593 }
594 
595 
596 
597 /*************************************************************************
598 |*
599 |* Function aktivieren
600 |*
601 \************************************************************************/
602 
603 void FuText::Activate()
604 {
605     pView->SetDragMode(SDRDRAG_MOVE);
606     SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
607     rBindings.Invalidate( SID_OBJECT_ROTATE );
608     rBindings.Invalidate( SID_OBJECT_MIRROR );
609 
610 //  Sofort in den Edit Mode setzen
611 //  SetInEditMode();
612 
613 //  if (!pTextObj)
614     {
615         /**********************************************************************
616         * Kein Textobjekt im EditMode, daher CreateMode setzen
617         **********************************************************************/
618         sal_uInt16 nObj = OBJ_TEXT;
619 
620 /*      sal_uInt16 nIdent;
621         sal_uInt32 nInvent;
622         pView->TakeCurrentObj(nIdent, nInvent);
623 */
624         pView->SetCurrentObj(nObj);
625 
626         pView->SetCreateMode();
627     }
628 
629     aNewPointer = Pointer(POINTER_TEXT);
630 //  aNewPointer = Pointer(POINTER_CROSS);               //! ???
631 
632     aOldPointer = pWindow->GetPointer();
633     pViewShell->SetActivePointer( aNewPointer );
634 
635     FuConstruct::Activate();
636 }
637 
638 
639 /*************************************************************************
640 |*
641 |* Function deaktivieren
642 |*
643 \************************************************************************/
644 
645 void FuText::Deactivate()
646 {
647     FuConstruct::Deactivate();
648     pViewShell->SetActivePointer( aOldPointer );
649     StopEditMode();
650 }
651 
652 
653 /*************************************************************************
654 |*
655 |* Selektion hat sich geaendert
656 |*
657 \************************************************************************/
658 
659 void FuText::SelectionHasChanged()
660 {
661     pView->SetDragMode(SDRDRAG_MOVE);
662     SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
663     rBindings.Invalidate( SID_OBJECT_ROTATE );
664     rBindings.Invalidate( SID_OBJECT_MIRROR );
665 
666     pTextObj = NULL;
667 
668     if ( pView->AreObjectsMarked() )
669     {
670         const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
671 
672         if (rMarkList.GetMarkCount() == 1)
673         {
674             SdrMark* pMark = rMarkList.GetMark(0);
675             SdrObject* pObj = pMark->GetMarkedSdrObj();
676 
677             sal_uInt16 nSdrObjKind = pObj->GetObjIdentifier();
678 
679             if (nSdrObjKind == OBJ_TEXT ||
680                 nSdrObjKind == OBJ_TITLETEXT ||
681                 nSdrObjKind == OBJ_OUTLINETEXT /* ||
682                 pObj->ISA(SdrTextObj) */ )
683             {
684                 pTextObj = (SdrTextObj*) pObj;
685             }
686         }
687     }
688 
689     if (!pTextObj)
690     {
691         /**********************************************************************
692         * Kein Textobjekt im EditMode, daher CreateMode setzen
693         **********************************************************************/
694         sal_uInt16 nObj = OBJ_TEXT;
695         sal_uInt16 nIdent;
696         sal_uInt32 nInvent;
697         pView->TakeCurrentObj(nIdent, nInvent);
698 
699 //        if (! pView->IsEditMode() )
700 //        {
701 //            if (nIdent == OBJ_TEXT)
702 //            {
703 //                nObj = OBJ_TEXT;
704 //            }
705 //            else if (nIdent == OBJ_OUTLINETEXT)
706 //            {
707 //                nObj = OBJ_OUTLINETEXT;
708 //            }
709 //            else if (nIdent == OBJ_TITLETEXT)
710 //            {
711 //                nObj = OBJ_TITLETEXT;
712 //            }
713 //        }
714 
715         pView->SetCurrentObj(nObj);
716 
717         pView->SetCreateMode();
718     }
719 }
720 
721 /*************************************************************************
722 |*
723 |* Objekt in Edit-Mode setzen
724 |*
725 \************************************************************************/
726 
727 void FuText::SetInEditMode(SdrObject* pObj, const Point* pMousePixel,
728                             sal_Bool bCursorToEnd, const KeyEvent* pInitialKey)
729 {
730     /*  It is possible to pass a special (unselected) object in pObj, e.g. the
731         caption object of a cell note. If pObj is 0, then the selected object
732         is used. The layer will be relocked in FuText::StopEditMode(). */
733     if ( pObj && (pObj->GetLayer() == SC_LAYER_INTERN) )
734         pView->UnlockInternalLayer();
735 
736     if ( !pObj && pView->AreObjectsMarked() )
737     {
738         const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
739         if (rMarkList.GetMarkCount() == 1)
740         {
741             SdrMark* pMark = rMarkList.GetMark(0);
742             pObj = pMark->GetMarkedSdrObj();
743         }
744     }
745 
746     pTextObj = NULL;
747 
748     if ( pObj )
749     {
750         sal_uInt16 nSdrObjKind = pObj->GetObjIdentifier();
751 
752         if (nSdrObjKind == OBJ_TEXT ||
753             nSdrObjKind == OBJ_TITLETEXT ||
754             nSdrObjKind == OBJ_OUTLINETEXT ||
755             pObj->ISA(SdrTextObj))
756         {
757             SdrPageView* pPV = pView->GetSdrPageView();
758             Rectangle aRect = pObj->GetLogicRect();
759             Point aPnt = aRect.Center();
760 
761             if ( pObj->HasTextEdit() )
762             {
763                 SdrOutliner* pO = MakeOutliner();
764                 lcl_UpdateHyphenator( *pO, pObj );
765 
766                 //  vertical flag:
767                 //  deduced from slot ids only if text object has no content
768 
769                 sal_uInt16 nSlotID = aSfxRequest.GetSlot();
770                 sal_Bool bVertical = ( nSlotID == SID_DRAW_TEXT_VERTICAL );
771                 OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
772                 if ( pOPO )
773                     bVertical = pOPO->IsVertical();     // content wins
774                 pO->SetVertical( bVertical );
775 
776                 //!??   ohne uebergebenen Outliner stimmen die Defaults nicht ???!?
777                 if ( pView->SdrBeginTextEdit(pObj, pPV, pWindow, sal_True, pO) )
778                 {
779                     //  EditEngine-UndoManager anmelden
780                     pViewShell->SetDrawTextUndo( &pO->GetUndoManager() );
781 
782                     pTextObj = (SdrTextObj*) pObj;
783                     pView->SetEditMode();
784 
785                     //  set text cursor to click position or to end,
786                     //  pass initial key event to outliner view
787                     if ( pMousePixel || bCursorToEnd || pInitialKey )
788                     {
789                         OutlinerView* pOLV = pView->GetTextEditOutlinerView();
790                         if (pOLV)
791                         {
792                             if ( pMousePixel )
793                             {
794                                 MouseEvent aEditEvt( *pMousePixel, 1, MOUSE_SYNTHETIC, MOUSE_LEFT, 0 );
795                                 pOLV->MouseButtonDown(aEditEvt);
796                                 pOLV->MouseButtonUp(aEditEvt);
797                             }
798                             else if ( bCursorToEnd )
799                             {
800                                 ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND);
801                                 pOLV->SetSelection(aNewSelection);
802                             }
803 
804                             if ( pInitialKey )
805                                 pOLV->PostKeyEvent( *pInitialKey );
806                         }
807                     }
808                 }
809             }
810         }
811     }
812 }
813 
814 // #98185# Create default drawing objects via keyboard
815 SdrObject* FuText::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle)
816 {
817     // case SID_DRAW_TEXT:
818     // case SID_DRAW_TEXT_VERTICAL:
819     // case SID_DRAW_TEXT_MARQUEE:
820     // case SID_DRAW_NOTEEDIT:
821 
822     SdrObject* pObj = SdrObjFactory::MakeNewObject(
823         pView->GetCurrentObjInventor(), pView->GetCurrentObjIdentifier(),
824         0L, pDrDoc);
825 
826     if(pObj)
827     {
828         if(pObj->ISA(SdrTextObj))
829         {
830             SdrTextObj* pText = (SdrTextObj*)pObj;
831             pText->SetLogicRect(rRectangle);
832 
833             //  #105815# don't set default text, start edit mode instead
834             // String aText(ScResId(STR_CAPTION_DEFAULT_TEXT));
835             // pText->SetText(aText);
836 
837             sal_Bool bVertical = (SID_DRAW_TEXT_VERTICAL == nID);
838             sal_Bool bMarquee = (SID_DRAW_TEXT_MARQUEE == nID);
839 
840             pText->SetVerticalWriting(bVertical);
841 
842             if(bVertical)
843             {
844                 SfxItemSet aSet(pDrDoc->GetItemPool());
845 
846                 aSet.Put(SdrTextAutoGrowWidthItem(sal_True));
847                 aSet.Put(SdrTextAutoGrowHeightItem(sal_False));
848                 aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP));
849                 aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
850 
851                 pText->SetMergedItemSet(aSet);
852             }
853 
854             if(bMarquee)
855             {
856                 SfxItemSet aSet(pDrDoc->GetItemPool(), SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST);
857 
858                 aSet.Put( SdrTextAutoGrowWidthItem( sal_False ) );
859                 aSet.Put( SdrTextAutoGrowHeightItem( sal_False ) );
860                 aSet.Put( SdrTextAniKindItem( SDRTEXTANI_SLIDE ) );
861                 aSet.Put( SdrTextAniDirectionItem( SDRTEXTANI_LEFT ) );
862                 aSet.Put( SdrTextAniCountItem( 1 ) );
863                 aSet.Put( SdrTextAniAmountItem( (sal_Int16)pWindow->PixelToLogic(Size(2,1)).Width()) );
864 
865                 pObj->SetMergedItemSetAndBroadcast(aSet);
866             }
867 
868             SetInEditMode( pObj );      // #105815# start edit mode
869         }
870         else
871         {
872             DBG_ERROR("Object is NO text object");
873         }
874     }
875 
876     return pObj;
877 }
878 
879