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, SDRSEARCH_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, (OutputDevice*) NULL, 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, (OutputDevice*) NULL, 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, (OutputDevice*) NULL);
328 0 : if ( bRet )
329 0 : pView->GetCreateObj()->SetGridOffset( aGridOff );
330 : }
331 0 : else if (pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER | SDRSEARCH_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, (OutputDevice*) NULL, 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 : // return (bReturn);
363 0 : return true;
364 : }
365 :
366 : /*************************************************************************
367 : |*
368 : |* MouseMove-event
369 : |*
370 : \************************************************************************/
371 :
372 0 : bool FuText::MouseMove(const MouseEvent& rMEvt)
373 : {
374 0 : bool bReturn = false;
375 :
376 : // pViewShell->SetActivePointer(aNewPointer);
377 :
378 : pViewShell->SetActivePointer(pView->GetPreferredPointer(
379 0 : pWindow->PixelToLogic(rMEvt.GetPosPixel()), pWindow ));
380 :
381 0 : if (aDragTimer.IsActive() )
382 : {
383 0 : Point aOldPixel = pWindow->LogicToPixel( aMDPos );
384 0 : Point aNewPixel = rMEvt.GetPosPixel();
385 0 : if ( std::abs( aOldPixel.X() - aNewPixel.X() ) > SC_MAXDRAGMOVE ||
386 0 : std::abs( aOldPixel.Y() - aNewPixel.Y() ) > SC_MAXDRAGMOVE )
387 0 : aDragTimer.Stop();
388 : }
389 :
390 0 : Point aPix(rMEvt.GetPosPixel());
391 0 : Point aPnt(pWindow->PixelToLogic(aPix));
392 : // if object is being created then more than likely the mouse
393 : // position has been 'adjusted' for the current zoom, need to
394 : // restore the mouse position here to ensure resize works as expected
395 0 : if ( pView->GetCreateObj() )
396 0 : aPnt -= pView->GetCreateObj()->GetGridOffset();
397 :
398 0 : if ( pView->MouseMove(rMEvt, pWindow) )
399 0 : return true; // Event von der SdrView ausgewertet
400 :
401 0 : if ( pView->IsAction() )
402 : {
403 0 : ForceScroll(aPix);
404 0 : pView->MovAction(aPnt);
405 : }
406 :
407 0 : return bReturn;
408 : }
409 :
410 : /*************************************************************************
411 : |*
412 : |* MouseButtonUp-event
413 : |*
414 : \************************************************************************/
415 :
416 0 : bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
417 : {
418 : // remember button state for creation of own MouseEvents
419 0 : SetMouseButtonCode(rMEvt.GetButtons());
420 :
421 0 : bool bReturn = false;
422 :
423 0 : if (aDragTimer.IsActive() )
424 : {
425 0 : aDragTimer.Stop();
426 : }
427 :
428 0 : lcl_InvalidateAttribs( pViewShell->GetViewFrame()->GetBindings() );
429 :
430 0 : Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
431 :
432 0 : if ( pView->MouseButtonUp(rMEvt, pWindow) )
433 0 : return true; // Event von der SdrView ausgewertet
434 :
435 0 : if ( pView->IsDragObj() )
436 : {
437 0 : pView->EndDragObj( rMEvt.IsShift() );
438 0 : const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
439 0 : if (rMarkList.GetMarkCount() == 1)
440 : {
441 0 : SdrMark* pMark = rMarkList.GetMark(0);
442 0 : SdrObject* pObj = pMark->GetMarkedSdrObj();
443 0 : FuPoor* pPoor = pViewShell->GetViewData().GetView()->GetDrawFuncPtr();
444 0 : FuText* pText = static_cast<FuText*>(pPoor);
445 0 : pText->StopDragMode(pObj );
446 : }
447 0 : pView->ForceMarkedToAnotherPage();
448 : }
449 0 : else if ( pView->IsCreateObj() )
450 : {
451 0 : if (rMEvt.IsLeft())
452 : {
453 0 : pView->EndCreateObj(SDRCREATE_FORCEEND);
454 0 : if (aSfxRequest.GetSlot() == SID_DRAW_TEXT_MARQUEE)
455 : {
456 : // Lauftext-Objekt erzeugen?
457 :
458 0 : const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
459 0 : if (rMarkList.GetMark(0))
460 : {
461 0 : SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
462 :
463 : // die fuer das Scrollen benoetigten Attribute setzen
464 0 : SfxItemSet aItemSet( pDrDoc->GetItemPool(),
465 0 : SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST);
466 :
467 0 : aItemSet.Put( makeSdrTextAutoGrowWidthItem( false ) );
468 0 : aItemSet.Put( makeSdrTextAutoGrowHeightItem( false ) );
469 0 : aItemSet.Put( SdrTextAniKindItem( SDRTEXTANI_SLIDE ) );
470 0 : aItemSet.Put( SdrTextAniDirectionItem( SDRTEXTANI_LEFT ) );
471 0 : aItemSet.Put( SdrTextAniCountItem( 1 ) );
472 : aItemSet.Put( SdrTextAniAmountItem(
473 0 : (sal_Int16)pWindow->PixelToLogic(Size(2,1)).Width()) );
474 0 : pObj->SetMergedItemSetAndBroadcast(aItemSet);
475 : }
476 : }
477 :
478 : // init object different when vertical writing
479 0 : sal_uInt16 nSlotID(aSfxRequest.GetSlot());
480 0 : bool bVertical = (SID_DRAW_TEXT_VERTICAL == nSlotID);
481 0 : if(bVertical)
482 : {
483 0 : const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
484 0 : if(rMarkList.GetMark(0))
485 : {
486 0 : SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
487 0 : if(pObj && pObj->ISA(SdrTextObj))
488 : {
489 0 : SdrTextObj* pText = static_cast<SdrTextObj*>(pObj);
490 0 : SfxItemSet aSet(pDrDoc->GetItemPool());
491 :
492 0 : pText->SetVerticalWriting(true);
493 :
494 0 : aSet.Put(makeSdrTextAutoGrowWidthItem(true));
495 0 : aSet.Put(makeSdrTextAutoGrowHeightItem(false));
496 0 : aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP));
497 0 : aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
498 :
499 0 : pText->SetMergedItemSet(aSet);
500 : }
501 : }
502 : }
503 :
504 0 : SetInEditMode();
505 :
506 : // Modus verlassen bei einzelnem Klick
507 : // (-> fuconstr)
508 :
509 0 : if ( !pView->AreObjectsMarked() )
510 : {
511 0 : pView->MarkObj(aPnt, -2, false, rMEvt.IsMod1());
512 :
513 0 : SfxDispatcher& rDisp = pViewShell->GetViewData().GetDispatcher();
514 0 : if ( pView->AreObjectsMarked() )
515 0 : rDisp.Execute(SID_OBJECT_SELECT, SfxCallMode::SLOT | SfxCallMode::RECORD);
516 : else
517 0 : rDisp.Execute(aSfxRequest.GetSlot(), SfxCallMode::SLOT | SfxCallMode::RECORD);
518 : }
519 : }
520 : }
521 0 : else if ( pView->IsAction() )
522 : {
523 0 : pView->EndAction();
524 : }
525 0 : else if( !pView->IsAction() )
526 : {
527 0 : pWindow->ReleaseMouse();
528 :
529 0 : if ( !pView->AreObjectsMarked() && rMEvt.GetClicks() < 2 )
530 : {
531 0 : pView->MarkObj(aPnt, -2, false, rMEvt.IsMod1());
532 :
533 0 : SfxDispatcher& rDisp = pViewShell->GetViewData().GetDispatcher();
534 0 : if ( pView->AreObjectsMarked() )
535 0 : rDisp.Execute(SID_OBJECT_SELECT, SfxCallMode::SLOT | SfxCallMode::RECORD);
536 : else
537 0 : rDisp.Execute(aSfxRequest.GetSlot(), SfxCallMode::SLOT | SfxCallMode::RECORD);
538 : }
539 : }
540 :
541 0 : return bReturn;
542 : }
543 :
544 : /*************************************************************************
545 : |*
546 : |* Maus-Pointer umschalten
547 : |*
548 : \************************************************************************/
549 :
550 0 : void FuText::ForcePointer(const MouseEvent* /* pMEvt */)
551 : {
552 0 : pViewShell->SetActivePointer( aNewPointer );
553 0 : }
554 :
555 : /*************************************************************************
556 : |*
557 : |* Tastaturereignisse bearbeiten
558 : |*
559 : |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
560 : |* FALSE.
561 : |*
562 : \************************************************************************/
563 :
564 0 : bool FuText::KeyInput(const KeyEvent& rKEvt)
565 : {
566 0 : bool bReturn = false;
567 :
568 0 : if ( pView->KeyInput(rKEvt, pWindow) )
569 : {
570 0 : bReturn = true;
571 0 : lcl_InvalidateAttribs( pViewShell->GetViewFrame()->GetBindings() );
572 : }
573 : else
574 : {
575 0 : bReturn = FuDraw::KeyInput(rKEvt);
576 : }
577 :
578 0 : return bReturn;
579 : }
580 :
581 : /*************************************************************************
582 : |*
583 : |* Function aktivieren
584 : |*
585 : \************************************************************************/
586 :
587 0 : void FuText::Activate()
588 : {
589 0 : pView->SetDragMode(SDRDRAG_MOVE);
590 0 : SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
591 0 : rBindings.Invalidate( SID_OBJECT_ROTATE );
592 0 : rBindings.Invalidate( SID_OBJECT_MIRROR );
593 :
594 : // Sofort in den Edit Mode setzen
595 : // SetInEditMode();
596 :
597 : // if (!pTextObj)
598 : {
599 : /**********************************************************************
600 : * Kein Textobjekt im EditMode, daher CreateMode setzen
601 : **********************************************************************/
602 0 : sal_uInt16 nObj = OBJ_TEXT;
603 :
604 0 : pView->SetCurrentObj(nObj);
605 :
606 0 : pView->SetCreateMode();
607 : }
608 :
609 0 : aNewPointer = Pointer(POINTER_TEXT);
610 :
611 0 : aOldPointer = pWindow->GetPointer();
612 0 : pViewShell->SetActivePointer( aNewPointer );
613 :
614 0 : FuConstruct::Activate();
615 0 : }
616 :
617 : /*************************************************************************
618 : |*
619 : |* Function deaktivieren
620 : |*
621 : \************************************************************************/
622 :
623 0 : void FuText::Deactivate()
624 : {
625 0 : FuConstruct::Deactivate();
626 0 : pViewShell->SetActivePointer( aOldPointer );
627 0 : StopEditMode();
628 0 : }
629 :
630 : /*************************************************************************
631 : |*
632 : |* Selektion hat sich geaendert
633 : |*
634 : \************************************************************************/
635 :
636 0 : void FuText::SelectionHasChanged()
637 : {
638 0 : pView->SetDragMode(SDRDRAG_MOVE);
639 0 : SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
640 0 : rBindings.Invalidate( SID_OBJECT_ROTATE );
641 0 : rBindings.Invalidate( SID_OBJECT_MIRROR );
642 :
643 0 : pTextObj = NULL;
644 :
645 0 : if ( pView->AreObjectsMarked() )
646 : {
647 0 : const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
648 :
649 0 : if (rMarkList.GetMarkCount() == 1)
650 : {
651 0 : SdrMark* pMark = rMarkList.GetMark(0);
652 0 : SdrObject* pObj = pMark->GetMarkedSdrObj();
653 :
654 0 : sal_uInt16 nSdrObjKind = pObj->GetObjIdentifier();
655 :
656 0 : if (nSdrObjKind == OBJ_TEXT ||
657 0 : nSdrObjKind == OBJ_TITLETEXT ||
658 : nSdrObjKind == OBJ_OUTLINETEXT /* ||
659 : pObj->ISA(SdrTextObj) */ )
660 : {
661 0 : pTextObj = static_cast<SdrTextObj*>(pObj);
662 : }
663 : }
664 : }
665 :
666 0 : if (!pTextObj)
667 : {
668 : /**********************************************************************
669 : * Kein Textobjekt im EditMode, daher CreateMode setzen
670 : **********************************************************************/
671 0 : sal_uInt16 nObj = OBJ_TEXT;
672 : sal_uInt16 nIdent;
673 : sal_uInt32 nInvent;
674 0 : pView->TakeCurrentObj(nIdent, nInvent);
675 :
676 0 : pView->SetCurrentObj(nObj);
677 :
678 0 : pView->SetCreateMode();
679 : }
680 0 : }
681 :
682 : /*************************************************************************
683 : |*
684 : |* Objekt in Edit-Mode setzen
685 : |*
686 : \************************************************************************/
687 :
688 0 : void FuText::SetInEditMode(SdrObject* pObj, const Point* pMousePixel,
689 : bool bCursorToEnd, const KeyEvent* pInitialKey)
690 : {
691 : /* It is possible to pass a special (unselected) object in pObj, e.g. the
692 : caption object of a cell note. If pObj is 0, then the selected object
693 : is used. The layer will be relocked in FuText::StopEditMode(). */
694 0 : if ( pObj && (pObj->GetLayer() == SC_LAYER_INTERN) )
695 0 : pView->UnlockInternalLayer();
696 :
697 0 : if ( !pObj && pView->AreObjectsMarked() )
698 : {
699 0 : const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
700 0 : if (rMarkList.GetMarkCount() == 1)
701 : {
702 0 : SdrMark* pMark = rMarkList.GetMark(0);
703 0 : pObj = pMark->GetMarkedSdrObj();
704 : }
705 : }
706 :
707 0 : pTextObj = NULL;
708 :
709 0 : if ( pObj )
710 : {
711 0 : sal_uInt16 nSdrObjKind = pObj->GetObjIdentifier();
712 :
713 0 : if (nSdrObjKind == OBJ_TEXT ||
714 0 : nSdrObjKind == OBJ_TITLETEXT ||
715 0 : nSdrObjKind == OBJ_OUTLINETEXT ||
716 0 : pObj->ISA(SdrTextObj))
717 : {
718 0 : SdrPageView* pPV = pView->GetSdrPageView();
719 :
720 0 : if ( pObj->HasTextEdit() )
721 : {
722 0 : SdrOutliner* pO = MakeOutliner();
723 0 : lcl_UpdateHyphenator( *pO, pObj );
724 :
725 : // vertical flag:
726 : // deduced from slot ids only if text object has no content
727 :
728 0 : sal_uInt16 nSlotID = aSfxRequest.GetSlot();
729 0 : bool bVertical = ( nSlotID == SID_DRAW_TEXT_VERTICAL );
730 0 : OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
731 0 : if ( pOPO )
732 0 : bVertical = pOPO->IsVertical(); // content wins
733 0 : pO->SetVertical( bVertical );
734 :
735 : //!?? ohne uebergebenen Outliner stimmen die Defaults nicht ???!?
736 0 : if ( pView->SdrBeginTextEdit(pObj, pPV, pWindow, true, pO) )
737 : {
738 : // EditEngine-UndoManager anmelden
739 0 : pViewShell->SetDrawTextUndo( &pO->GetUndoManager() );
740 :
741 0 : pTextObj = static_cast<SdrTextObj*>(pObj);
742 0 : pView->SetEditMode();
743 :
744 : // set text cursor to click position or to end,
745 : // pass initial key event to outliner view
746 0 : if ( pMousePixel || bCursorToEnd || pInitialKey )
747 : {
748 0 : OutlinerView* pOLV = pView->GetTextEditOutlinerView();
749 0 : if (pOLV)
750 : {
751 0 : if ( pMousePixel )
752 : {
753 0 : MouseEvent aEditEvt( *pMousePixel, 1, MOUSE_SYNTHETIC, MOUSE_LEFT, 0 );
754 0 : pOLV->MouseButtonDown(aEditEvt);
755 0 : pOLV->MouseButtonUp(aEditEvt);
756 : }
757 0 : else if ( bCursorToEnd )
758 : {
759 0 : ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND);
760 0 : pOLV->SetSelection(aNewSelection);
761 : }
762 :
763 0 : if ( pInitialKey )
764 0 : pOLV->PostKeyEvent( *pInitialKey );
765 : }
766 : }
767 : }
768 : }
769 : }
770 : }
771 0 : }
772 :
773 : // Create default drawing objects via keyboard
774 0 : SdrObject* FuText::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle)
775 : {
776 : // case SID_DRAW_TEXT:
777 : // case SID_DRAW_TEXT_VERTICAL:
778 : // case SID_DRAW_TEXT_MARQUEE:
779 : // case SID_DRAW_NOTEEDIT:
780 :
781 : SdrObject* pObj = SdrObjFactory::MakeNewObject(
782 0 : pView->GetCurrentObjInventor(), pView->GetCurrentObjIdentifier(),
783 0 : 0L, pDrDoc);
784 :
785 0 : if(pObj)
786 : {
787 0 : if(pObj->ISA(SdrTextObj))
788 : {
789 0 : SdrTextObj* pText = static_cast<SdrTextObj*>(pObj);
790 0 : pText->SetLogicRect(rRectangle);
791 :
792 : // don't set default text, start edit mode instead
793 : // String aText(ScResId(STR_CAPTION_DEFAULT_TEXT));
794 : // pText->SetText(aText);
795 :
796 0 : bool bVertical = (SID_DRAW_TEXT_VERTICAL == nID);
797 0 : bool bMarquee = (SID_DRAW_TEXT_MARQUEE == nID);
798 :
799 0 : pText->SetVerticalWriting(bVertical);
800 :
801 0 : if(bVertical)
802 : {
803 0 : SfxItemSet aSet(pDrDoc->GetItemPool());
804 :
805 0 : aSet.Put(makeSdrTextAutoGrowWidthItem(true));
806 0 : aSet.Put(makeSdrTextAutoGrowHeightItem(false));
807 0 : aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP));
808 0 : aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
809 :
810 0 : pText->SetMergedItemSet(aSet);
811 : }
812 :
813 0 : if(bMarquee)
814 : {
815 0 : SfxItemSet aSet(pDrDoc->GetItemPool(), SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST);
816 :
817 0 : aSet.Put( makeSdrTextAutoGrowWidthItem( false ) );
818 0 : aSet.Put( makeSdrTextAutoGrowHeightItem( false ) );
819 0 : aSet.Put( SdrTextAniKindItem( SDRTEXTANI_SLIDE ) );
820 0 : aSet.Put( SdrTextAniDirectionItem( SDRTEXTANI_LEFT ) );
821 0 : aSet.Put( SdrTextAniCountItem( 1 ) );
822 0 : aSet.Put( SdrTextAniAmountItem( (sal_Int16)pWindow->PixelToLogic(Size(2,1)).Width()) );
823 :
824 0 : pObj->SetMergedItemSetAndBroadcast(aSet);
825 : }
826 :
827 0 : SetInEditMode( pObj ); // start edit mode
828 : }
829 : else
830 : {
831 : OSL_FAIL("Object is NO text object");
832 : }
833 : }
834 :
835 0 : return pObj;
836 228 : }
837 :
838 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|