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