xref: /trunk/main/sw/source/ui/ribbar/drawbase.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 #include <hintids.hxx>
32 #include <tools/list.hxx>
33 #include <svx/svdview.hxx>
34 #include <svx/svdobj.hxx>
35 #include <svl/ptitem.hxx>
36 #include <editeng/sizeitem.hxx>
37 #include <sfx2/request.hxx>
38 #include <sfx2/bindings.hxx>
39 #include <fmtclds.hxx>
40 #include <frmfmt.hxx>
41 #include "cmdid.h"
42 #include "basesh.hxx"
43 #include "view.hxx"
44 #include "wrtsh.hxx"
45 #include "drawbase.hxx"
46 #include "edtwin.hxx"
47 #include "caption.hxx"
48 #include "swundo.hxx"
49 #include <SwRewriter.hxx>
50 #include "comcore.hrc"
51 
52 using namespace ::com::sun::star;
53 
54 extern sal_Bool bNoInterrupt;       // in mainwn.cxx
55 
56 #define MINMOVE ((sal_uInt16)m_pSh->GetOut()->PixelToLogic(Size(m_pSh->GetDrawView()->GetMarkHdlSizePixel()/2,0)).Width())
57 
58 
59 /*************************************************************************
60 |*
61 |* Konstruktor
62 |*
63 \************************************************************************/
64 
65 
66 SwDrawBase::SwDrawBase(SwWrtShell* pSwWrtShell, SwEditWin* pWindow, SwView* pSwView) :
67     m_pView(pSwView),
68     m_pSh(pSwWrtShell),
69     m_pWin(pWindow),
70     m_nSlotId(USHRT_MAX),
71     m_bCreateObj(sal_True),
72     m_bInsForm(sal_False)
73 {
74     if ( !m_pSh->HasDrawView() )
75         m_pSh->MakeDrawView();
76 }
77 
78 /*************************************************************************
79 |*
80 |* Destruktor
81 |*
82 \************************************************************************/
83 
84 __EXPORT SwDrawBase::~SwDrawBase()
85 {
86     if (m_pView->GetWrtShellPtr()) // Im view-Dtor koennte die wrtsh bereits geloescht worden sein...
87         m_pSh->GetDrawView()->SetEditMode(sal_True);
88 }
89 
90 /*************************************************************************
91 |*
92 |* MouseButtonDown-event
93 |*
94 \************************************************************************/
95 
96 
97 sal_Bool SwDrawBase::MouseButtonDown(const MouseEvent& rMEvt)
98 {
99     sal_Bool bReturn = sal_False;
100 
101     SdrView *pSdrView = m_pSh->GetDrawView();
102 
103     // #i33136#
104     // pSdrView->SetOrtho(rMEvt.IsShift());
105     pSdrView->SetOrtho(doConstructOrthogonal() ? !rMEvt.IsShift() : rMEvt.IsShift());
106     pSdrView->SetAngleSnapEnabled(rMEvt.IsShift());
107 
108     if (rMEvt.IsMod2())
109     {
110         pSdrView->SetCreate1stPointAsCenter(sal_True);
111         pSdrView->SetResizeAtCenter(sal_True);
112     }
113     else
114     {
115         pSdrView->SetCreate1stPointAsCenter(sal_False);
116         pSdrView->SetResizeAtCenter(sal_False);
117     }
118 
119     SdrViewEvent aVEvt;
120     SdrHitKind eHit = pSdrView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
121 
122     // Nur neues Objekt, wenn nicht im Basismode (bzw reinem Selektionsmode)
123     if (rMEvt.IsLeft() && !m_pWin->IsDrawAction())
124     {
125         if (IsCreateObj() && (eHit == SDRHIT_UNMARKEDOBJECT || eHit == SDRHIT_NONE || m_pSh->IsDrawCreate()))
126         {
127             bNoInterrupt = sal_True;
128             m_pWin->CaptureMouse();
129 
130             m_aStartPos = m_pWin->PixelToLogic(rMEvt.GetPosPixel());
131 
132             bReturn = m_pSh->BeginCreate( static_cast< sal_uInt16 >(m_pWin->GetSdrDrawMode()), m_aStartPos);
133 
134             SetDrawPointer();
135 
136             if ( bReturn )
137                 m_pWin->SetDrawAction(sal_True);
138         }
139         else if (!pSdrView->IsAction())
140         {
141             /**********************************************************************
142             * BEZIER-EDITOR
143             **********************************************************************/
144             m_pWin->CaptureMouse();
145             m_aStartPos = m_pWin->PixelToLogic(rMEvt.GetPosPixel());
146             sal_uInt16 nEditMode = m_pWin->GetBezierMode();
147 
148             if (eHit == SDRHIT_HANDLE && aVEvt.pHdl->GetKind() == HDL_BWGT)
149             {
150                 /******************************************************************
151                 * Handle draggen
152                 ******************************************************************/
153                 bNoInterrupt = sal_True;
154                 bReturn = pSdrView->BegDragObj(m_aStartPos, (OutputDevice*) NULL, aVEvt.pHdl);
155                 m_pWin->SetDrawAction(sal_True);
156             }
157             else if (eHit == SDRHIT_MARKEDOBJECT && nEditMode == SID_BEZIER_INSERT)
158             {
159                 /******************************************************************
160                 * Klebepunkt einfuegen
161                 ******************************************************************/
162                 bNoInterrupt = sal_True;
163                 bReturn = pSdrView->BegInsObjPoint(m_aStartPos, rMEvt.IsMod1());
164                 m_pWin->SetDrawAction(sal_True);
165             }
166             else if (eHit == SDRHIT_MARKEDOBJECT && rMEvt.IsMod1())
167             {
168                 /******************************************************************
169                 * Klebepunkt selektieren
170                 ******************************************************************/
171                 if (!rMEvt.IsShift())
172                     pSdrView->UnmarkAllPoints();
173 
174                 bReturn = pSdrView->BegMarkPoints(m_aStartPos);
175                 m_pWin->SetDrawAction(sal_True);
176             }
177             else if (eHit == SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() && !rMEvt.IsMod2())
178             {
179                 /******************************************************************
180                 * Objekt verschieben
181                 ******************************************************************/
182                 return sal_False;
183             }
184             else if (eHit == SDRHIT_HANDLE)
185             {
186                 /******************************************************************
187                 * Klebepunkt selektieren
188                 ******************************************************************/
189                 if (pSdrView->HasMarkablePoints() && (!pSdrView->IsPointMarked(*aVEvt.pHdl) || rMEvt.IsShift()))
190                 {
191                     SdrHdl* pHdl = NULL;
192 
193                     if (!rMEvt.IsShift())
194                     {
195                         pSdrView->UnmarkAllPoints();
196                         pHdl = pSdrView->PickHandle(m_aStartPos);
197                     }
198                     else
199                     {
200                         if (pSdrView->IsPointMarked(*aVEvt.pHdl))
201                         {
202                             bReturn = pSdrView->UnmarkPoint(*aVEvt.pHdl);
203                             pHdl = NULL;
204                         }
205                         else
206                         {
207                             pHdl = pSdrView->PickHandle(m_aStartPos);
208                         }
209                     }
210 
211                     if (pHdl)
212                     {
213                         bNoInterrupt = sal_True;
214                         pSdrView->MarkPoint(*pHdl);
215 //                      bReturn = pSdrView->BegDragObj(m_aStartPos, (OutputDevice*) NULL, pHdl);
216 //                      m_pWin->SetDrawAction(sal_True);
217                     }
218                 }
219             }
220             else
221             {
222                 /******************************************************************
223                 * Objekt selektieren oder draggen
224                 ******************************************************************/
225                 if (m_pSh->IsObjSelectable(m_aStartPos) && eHit == SDRHIT_UNMARKEDOBJECT)
226                 {
227                     if (pSdrView->HasMarkablePoints())
228                         pSdrView->UnmarkAllPoints();
229 
230                     bNoInterrupt = sal_False;
231                     // Drag im edtwin verwenden
232                     return sal_False;
233                 }
234 
235                 bNoInterrupt = sal_True;
236 
237                 if (m_pSh->IsObjSelected())
238                 {
239                     if (!rMEvt.IsShift())
240                     {
241                         if (!pSdrView->HasMarkablePoints())
242                         {
243                             //JP 10.10.2001: Bug 89619 - don't scroll the
244                             //              cursor into the visible area
245                             sal_Bool bUnlockView = !m_pSh->IsViewLocked();
246                             m_pSh->LockView( sal_True ); //lock visible section
247                             m_pSh->SelectObj(Point(LONG_MAX, LONG_MAX)); // Alles deselektieren
248                             if( bUnlockView )
249                                 m_pSh->LockView( sal_False );
250                         }
251                         else
252                             pSdrView->UnmarkAllPoints();
253                     }
254                 }
255                 if (!m_pSh->IsSelFrmMode())
256                     m_pSh->EnterSelFrmMode(NULL);
257 
258                 if( 0 != (bReturn = m_pSh->BeginMark(m_aStartPos)) )
259                     m_pWin->SetDrawAction(sal_True);
260 
261                 SetDrawPointer();
262             }
263         }
264     }
265     return bReturn;
266 }
267 
268 /*************************************************************************
269 |*
270 |* MouseMove-event
271 |*
272 \************************************************************************/
273 
274 
275 sal_Bool SwDrawBase::MouseMove(const MouseEvent& rMEvt)
276 {
277     SdrView *pSdrView = m_pSh->GetDrawView();
278     Point aPnt(m_pWin->PixelToLogic(rMEvt.GetPosPixel()));
279     sal_Bool bRet = sal_False;
280 
281     if (IsCreateObj() && !m_pWin->IsDrawSelMode() && pSdrView->IsCreateObj())
282     {
283         // #i33136#
284         // pSdrView->SetOrtho(rMEvt.IsShift());
285         pSdrView->SetOrtho(doConstructOrthogonal() ? !rMEvt.IsShift() : rMEvt.IsShift());
286         pSdrView->SetAngleSnapEnabled(rMEvt.IsShift());
287 
288         m_pSh->MoveCreate(aPnt);
289         bRet = sal_True;
290     }
291     else if (pSdrView->IsAction() || pSdrView->IsInsObjPoint() || pSdrView->IsMarkPoints())
292     {
293         m_pSh->MoveMark(aPnt);
294         bRet = sal_True;
295     }
296 
297     return (bRet);
298 }
299 
300 /*************************************************************************
301 |*
302 |* MouseButtonUp-event
303 |*
304 \************************************************************************/
305 
306 
307 sal_Bool SwDrawBase::MouseButtonUp(const MouseEvent& rMEvt)
308 {
309     sal_Bool bReturn = sal_False;
310     sal_Bool bCheckShell = sal_False;
311     sal_Bool bAutoCap = sal_False;
312 
313     Point aPnt(m_pWin->PixelToLogic(rMEvt.GetPosPixel()));
314 
315     if (IsCreateObj() && m_pSh->IsDrawCreate() && !m_pWin->IsDrawSelMode())
316     {
317         const SdrObjKind nDrawMode = m_pWin->GetSdrDrawMode();
318         //objects with multiple point may end at the start position
319         sal_Bool bMultiPoint = OBJ_PLIN == nDrawMode ||
320                                 OBJ_PATHLINE == nDrawMode ||
321                                 OBJ_FREELINE == nDrawMode;
322         if(rMEvt.IsRight() || (aPnt == m_aStartPos && !bMultiPoint))
323         {
324             m_pSh->BreakCreate();
325             m_pView->LeaveDrawCreate();
326         }
327         else
328         {
329             if (OBJ_NONE == nDrawMode)
330             {
331                 SwRewriter aRewriter;
332 
333                 aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_FRAME));
334                 m_pSh->StartUndo(UNDO_INSERT, &aRewriter);
335             }
336 
337             m_pSh->EndCreate(SDRCREATE_FORCEEND);
338             if (OBJ_NONE == nDrawMode)   // Textrahmen eingefuegt
339             {
340                uno::Reference< frame::XDispatchRecorder > xRecorder =
341                     m_pSh->GetView().GetViewFrame()->GetBindings().GetRecorder();
342                 if ( xRecorder.is() )
343                 {
344                     SfxRequest aReq(m_pSh->GetView().GetViewFrame(),FN_INSERT_FRAME);
345                         aReq.AppendItem(SfxUInt16Item( FN_INSERT_FRAME,
346                                 static_cast<sal_uInt16>(FLY_AT_PARA) ));
347                         aReq.AppendItem(SfxPointItem( FN_PARAM_1, m_pSh->GetAnchorObjDiff()));
348                         aReq.AppendItem(SvxSizeItem( FN_PARAM_2, m_pSh->GetObjSize()));
349                     aReq.Done();
350                 }
351                 bAutoCap = sal_True;
352                 if(m_pWin->GetFrmColCount() > 1)
353                 {
354                     SfxItemSet aSet(m_pView->GetPool(),RES_COL,RES_COL);
355                     SwFmtCol aCol((const SwFmtCol&)aSet.Get(RES_COL));
356                     aCol.Init(m_pWin->GetFrmColCount(), aCol.GetGutterWidth(), aCol.GetWishWidth());
357                     aSet.Put(aCol);
358                     // Vorlagen-AutoUpdate
359                     SwFrmFmt* pFmt = m_pSh->GetCurFrmFmt();
360                     if(pFmt && pFmt->IsAutoUpdateFmt())
361                         m_pSh->AutoUpdateFrame(pFmt, aSet);
362                     else
363                         m_pSh->SetFlyFrmAttr( aSet );
364                 }
365             }
366             if (m_pWin->GetSdrDrawMode() == OBJ_NONE)
367             {
368                 m_pSh->EndUndo();
369             }
370         }
371 
372         bReturn = sal_True;
373 
374         EnterSelectMode(rMEvt);
375     }
376     else
377     {
378         SdrView *pSdrView = m_pSh->GetDrawView();
379 
380         if (!pSdrView->HasMarkablePoints())
381         {
382             /**********************************************************************
383             * KEIN BEZIER_EDITOR
384             **********************************************************************/
385             if ((m_pSh->GetDrawView()->IsMarkObj() || m_pSh->GetDrawView()->IsMarkPoints())
386                  && rMEvt.IsLeft())
387             {
388                 bReturn = m_pSh->EndMark();
389 
390                 m_pWin->SetDrawAction(sal_False);
391 
392                 if (aPnt == m_aStartPos && m_pSh->IsObjSelectable(aPnt))
393                 {
394                     m_pSh->SelectObj(aPnt, ( rMEvt.IsShift() &&
395                                    m_pSh->IsSelFrmMode()) ? SW_ADD_SELECT : 0);
396 
397                     if (!m_pSh->IsObjSelected())
398                     {
399                         m_pView->LeaveDrawCreate();    // In Selektionsmode wechseln
400 
401                         m_pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
402 
403                         if (m_pSh->IsSelFrmMode())
404                             m_pSh->LeaveSelFrmMode();
405                     }
406                     m_pView->NoRotate();
407 
408                     bCheckShell = sal_True; // ggf BezierShell anwerfen
409                 }
410                 else if (!m_pSh->IsObjSelected() && !m_pWin->IsDrawAction())
411                 {
412                     if (m_pSh->IsObjSelectable(aPnt))
413                         m_pSh->SelectObj(aPnt, ( rMEvt.IsShift() &&
414                             m_pSh->IsSelFrmMode() ) ? SW_ADD_SELECT : 0 );
415                     else
416                     {
417                         m_pView->LeaveDrawCreate();
418                         if (m_pSh->IsSelFrmMode())
419                             m_pSh->LeaveSelFrmMode();
420                     }
421                     m_pView->NoRotate();
422 
423                     bReturn = sal_True;
424                 }
425             }
426         }
427         else
428         {
429             /**********************************************************************
430             * BEZIER_EDITOR
431             **********************************************************************/
432             if ( pSdrView->IsAction() )
433             {
434                 if ( pSdrView->IsInsObjPoint() )
435                     bReturn = pSdrView->EndInsObjPoint(SDRCREATE_FORCEEND);
436                 else if (pSdrView->IsMarkPoints() )
437                     bReturn = pSdrView->EndMarkPoints();
438                 else
439                 {
440                     pSdrView->EndAction();
441                     bReturn = sal_True;
442                 }
443                 m_pWin->SetDrawAction(sal_False);
444 
445                 if (aPnt == m_aStartPos)
446                 {
447                     if (!m_pSh->IsObjSelectable(aPnt))
448                         m_pSh->SelectObj(Point(LONG_MAX, LONG_MAX));
449                     else if (!bReturn)
450                     {
451                         if (!rMEvt.IsShift())
452                             pSdrView->UnmarkAllPoints();
453                         m_pSh->SelectObj(aPnt, (rMEvt.IsShift() &&
454                                        m_pSh->IsSelFrmMode()) ? SW_ADD_SELECT :0);
455                     }
456 
457                     if (!m_pSh->IsObjSelected())
458                     {
459                         m_pView->LeaveDrawCreate();    // In Selektionsmode wechseln
460 
461                         m_pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
462 
463                         if (m_pSh->IsSelFrmMode())
464                             m_pSh->LeaveSelFrmMode();
465                     }
466                     m_pView->NoRotate();
467 
468                     bCheckShell = sal_True; // ggf BezierShell anwerfen
469                 }
470             }
471 
472             SetDrawPointer();
473 
474             if (!m_pSh->IsObjSelected() && !m_pWin->IsDrawAction())
475             {
476                 m_pView->LeaveDrawCreate();
477                 if (m_pSh->IsSelFrmMode())
478                     m_pSh->LeaveSelFrmMode();
479 
480                 m_pView->NoRotate();
481                 bReturn = sal_True;
482             }
483         }
484     }
485 
486     if (bCheckShell)
487         m_pView->AttrChangedNotify( m_pSh ); // ggf BezierShell anwerfen
488 
489     //!!!!!!!!!! Achtung Suizid !!!!!!!!!!! Sollte alles mal erneuert werden
490     if ( bAutoCap )
491         m_pView->AutoCaption(FRAME_CAP);   //Kann derzeit nur FRAME sein, sonst auf
492                                         //enums umstellen
493     return (bReturn);
494 }
495 
496 /*************************************************************************
497 |*
498 |* Function aktivieren
499 |*
500 \************************************************************************/
501 
502 
503 void SwDrawBase::Activate(const sal_uInt16 nSlot)
504 {
505     SetSlotId(nSlot);
506     SdrView *pSdrView = m_pSh->GetDrawView();
507 
508     pSdrView->SetCurrentObj( static_cast< sal_uInt16 >(m_pWin->GetSdrDrawMode()) );
509     pSdrView->SetEditMode(sal_False);
510 
511     SetDrawPointer();
512     m_pSh->NoEdit();
513 }
514 
515 /*************************************************************************
516 |*
517 |* Function deaktivieren
518 |*
519 \************************************************************************/
520 
521 
522 void __EXPORT SwDrawBase::Deactivate()
523 {
524     SdrView *pSdrView = m_pSh->GetDrawView();
525     pSdrView->SetOrtho(sal_False);
526     pSdrView->SetAngleSnapEnabled(sal_False);
527 
528     if (m_pWin->IsDrawAction() && m_pSh->IsDrawCreate())
529         m_pSh->BreakCreate();
530 
531     m_pWin->SetDrawAction(sal_False);
532 
533     m_pWin->ReleaseMouse();
534     bNoInterrupt = sal_False;
535 
536 //  if(!m_pSh->IsObjSelected())
537 //      m_pSh->Edit();
538 
539     if(m_pWin->GetApplyTemplate())
540         m_pWin->SetApplyTemplate(SwApplyTemplate());
541     m_pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
542 }
543 
544 /*************************************************************************
545 |*
546 |* Tastaturereignisse bearbeiten
547 |*
548 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
549 |* sal_False.
550 |*
551 \************************************************************************/
552 
553 
554 sal_Bool SwDrawBase::KeyInput(const KeyEvent& rKEvt)
555 {
556     sal_Bool bReturn = sal_False;
557     sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
558 
559     switch (nCode)
560     {
561         case KEY_ESCAPE:
562         {
563             if (m_pWin->IsDrawAction())
564             {
565                 BreakCreate();
566                 m_pView->LeaveDrawCreate();
567             }
568 
569             bReturn = sal_True;
570         }
571         break;
572 
573         case KEY_DELETE:
574         {
575             m_pSh->DelSelectedObj();
576             bReturn = sal_True;
577         }
578         break;
579 
580         case KEY_UP:
581         case KEY_DOWN:
582         case KEY_LEFT:
583         case KEY_RIGHT:
584         {
585             SdrView *pSdrView = m_pSh->GetDrawView();
586 
587             if (!pSdrView->IsTextEdit())
588             {
589                 long nX = 0;
590                 long nY = 0;
591 
592                 if (nCode == KEY_UP)
593                 {
594                     // Scroll nach oben
595                     nX = 0;
596                     nY =-1;
597                 }
598                 else if (nCode == KEY_DOWN)
599                 {
600                     // Scroll nach unten
601                     nX = 0;
602                     nY = 1;
603                 }
604                 else if (nCode == KEY_LEFT)
605                 {
606                     // Scroll nach links
607                     nX =-1;
608                     nY = 0;
609                 }
610                 else if (nCode == KEY_RIGHT)
611                 {
612                     // Scroll nach rechts
613                     nX = 1;
614                     nY = 0;
615                 }
616 
617                 if (pSdrView->AreObjectsMarked() && rKEvt.GetKeyCode().IsMod2())
618                 {
619                     // Objekte verschieben
620                     nX *= 100;
621                     nY *= 100;
622                     pSdrView->MoveAllMarked(Size(nX, nY));
623                 }
624 
625                 bReturn = sal_True;
626             }
627         }
628         break;
629     }
630 
631     return (bReturn);
632 }
633 
634 
635 /*************************************************************************
636 |*
637 |* Tastaturereignisse bearbeiten
638 |*
639 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
640 |* sal_False.
641 |*
642 \************************************************************************/
643 
644 
645 void SwDrawBase::BreakCreate()
646 {
647     m_pSh->BreakCreate();
648     m_pWin->SetDrawAction(sal_False);
649     m_pWin->ReleaseMouse();
650 
651     Deactivate();
652 //  m_pView->LeaveDrawCreate();
653 }
654 
655 /*************************************************************************
656 |*
657 |* Mauspointer umschalten
658 |*
659 \************************************************************************/
660 
661 
662 void SwDrawBase::SetDrawPointer()
663 {
664     SdrView *pSdrView = m_pSh->GetDrawView();
665         Point aPnt(m_pWin->OutputToScreenPixel(m_pWin->GetPointerPosPixel()));
666     aPnt = m_pWin->PixelToLogic(m_pWin->ScreenToOutputPixel(aPnt));
667     const Pointer aPointTyp = pSdrView->GetPreferedPointer(aPnt, m_pSh->GetOut());
668     const Pointer aDrawPt(aPointTyp);
669     m_pWin->SetPointer(aDrawPt);
670 }
671 
672 /*************************************************************************
673 |*
674 |* Ggf in Selektionsmode wechseln
675 |*
676 \************************************************************************/
677 
678 void SwDrawBase::EnterSelectMode(const MouseEvent& rMEvt)
679 {
680     m_pWin->SetDrawAction(sal_False);
681 
682     if (!m_pSh->IsObjSelected() && !m_pWin->IsDrawAction())
683     {
684         Point aPnt(m_pWin->PixelToLogic(rMEvt.GetPosPixel()));
685 
686         if (m_pSh->IsObjSelectable(aPnt))
687         {
688             m_pSh->SelectObj(aPnt);
689             if (rMEvt.GetModifier() == KEY_SHIFT || !m_pSh->IsObjSelected())
690             {
691                 m_pView->LeaveDrawCreate();    // In Selektionsmode wechseln
692 
693                 m_pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
694             }
695         }
696         else
697         {
698             m_pView->LeaveDrawCreate();
699             if (m_pSh->IsSelFrmMode())
700                 m_pSh->LeaveSelFrmMode();
701         }
702         m_pView->NoRotate();
703     }
704 }
705 /* -----------------------------03.04.2002 10:52------------------------------
706 
707  ---------------------------------------------------------------------------*/
708 void SwDrawBase::CreateDefaultObject()
709 {
710     Point aStartPos = GetDefaultCenterPos();
711     Point aEndPos(aStartPos);
712     aStartPos.X() -= 8 * MM50;
713     aStartPos.Y() -= 4 * MM50;
714     aEndPos.X() += 8 * MM50;
715     aEndPos.Y() += 4 * MM50;
716     Rectangle aRect(aStartPos, aEndPos);
717     m_pSh->CreateDefaultShape( static_cast< sal_uInt16 >(m_pWin->GetSdrDrawMode()), aRect, m_nSlotId);
718 }
719 /* -----------------25.10.2002 14:14-----------------
720  *
721  * --------------------------------------------------*/
722 Point  SwDrawBase::GetDefaultCenterPos()
723 {
724     Size aDocSz(m_pSh->GetDocSize());
725     const SwRect& rVisArea = m_pSh->VisArea();
726     Point aStartPos = rVisArea.Center();
727     if(rVisArea.Width() > aDocSz.Width())
728         aStartPos.X() = aDocSz.Width() / 2 + rVisArea.Left();
729     if(rVisArea.Height() > aDocSz.Height())
730         aStartPos.Y() = aDocSz.Height() / 2 + rVisArea.Top();
731     return aStartPos;
732 }
733 
734 // #i33136#
735 bool SwDrawBase::doConstructOrthogonal() const
736 {
737     return false;
738 }
739 
740 // eof
741